{"record":{"id":"084b3618eef8b273","repo":"toeverything/AFFiNE","slug":"invalid-byok-key","errorCode":null,"errorMessage":"Invalid BYOK key.","messagePattern":"Invalid BYOK key\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/frontend/apps/electron/src/main/byok-storage/handlers.ts","lineNumber":173,"sourceCode":"\nfunction normalizeKey(\n  key: WorkspaceByokKeyInput,\n  existing?: WorkspaceByokKey,\n  defaultSortOrder = 0\n): WorkspaceByokKey {\n  if (!allowedProviders.has(key.provider)) {\n    throw new Error('Unsupported BYOK provider.');\n  }\n  const credential = key.credential ?? existing?.credential;\n  const definition = key.definition ?? existing?.definition;\n  if (\n    definition?.endpoint.kind === 'openai_compatible' &&\n    key.provider !== 'openai'\n  ) {\n    throw new Error('OpenAI-compatible endpoints require OpenAI provider.');\n  }\n  if (!key.id || !key.name || !credential || !isValidDefinition(definition)) {\n    throw new Error('Invalid BYOK key.');\n  }\n  return {\n    id: key.id,\n    provider: key.provider,\n    name: key.name,\n    description: hasOwnField(key, 'description')\n      ? (key.description ?? null)\n      : (existing?.description ?? null),\n    credential,\n    definition,\n    sortOrder: hasOwnField(key, 'sortOrder')\n      ? (key.sortOrder ?? defaultSortOrder)\n      : (existing?.sortOrder ?? defaultSortOrder),\n    enabled: hasOwnField(key, 'enabled')\n      ? (key.enabled ?? true)\n      : (existing?.enabled ?? true),\n  };\n}","sourceCodeStart":155,"sourceCodeEnd":191,"githubUrl":"https://github.com/toeverything/AFFiNE/blob/b4c8548c09da21b2898443559a5b846f0ccf5dd8/packages/frontend/apps/electron/src/main/byok-storage/handlers.ts#L155-L191","documentation":"normalizeKey's final check throws 'Invalid BYOK key.' when required fields (id, name, credential) are missing or the model definition fails validation, a catch-all guard before persisting or decrypting workspace BYOK keys.","triggerScenarios":"Thrown at packages/frontend/apps/electron/src/main/byok-storage/handlers.ts:173 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Re-enter the API key; it failed validation against the provider.","Check for extra whitespace or truncation when pasting the key.","Generate a new key in the provider dashboard and save it again."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"b4c8548c09da21b2898443559a5b846f0ccf5dd8","analyzedAt":"2026-08-18T21:16:52.546Z","contentChangedAt":"2026-08-18T21:16:52.546Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}