{"record":{"id":"be4467c6df691e75","repo":"toeverything/AFFiNE","slug":"openai-compatible-endpoints-require-openai-provide","errorCode":null,"errorMessage":"OpenAI-compatible endpoints require OpenAI provider.","messagePattern":"OpenAI-compatible endpoints require OpenAI provider\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/frontend/apps/electron/src/main/byok-storage/handlers.ts","lineNumber":170,"sourceCode":"    )\n  );\n}\n\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)","sourceCodeStart":152,"sourceCodeEnd":188,"githubUrl":"https://github.com/toeverything/AFFiNE/blob/b4c8548c09da21b2898443559a5b846f0ccf5dd8/packages/frontend/apps/electron/src/main/byok-storage/handlers.ts#L152-L188","documentation":"A consistency guard in BYOK key normalization: workspace BYOK keys may declare a credential definition whose endpoint kind is 'openai_compatible', but such endpoints can only be used when the key's provider is exactly 'openai'. It fires when a key for a different provider (e.g. Anthropic) is paired with an openai_compatible endpoint definition; the faulting input is the key.provider vs key.definition.endpoint.kind combination.","triggerScenarios":"Thrown at packages/frontend/apps/electron/src/main/byok-storage/handlers.ts:170 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Select the OpenAI provider when using an OpenAI-compatible custom endpoint.","Do not combine a custom base URL with a non-OpenAI provider type.","Change the provider setting to OpenAI and retry saving the key."],"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-14T00:17:10.932Z"}