{"record":{"id":"b3b32c37ddf9960d","repo":"CherryHQ/cherry-studio","slug":"provider-extension-providerid-not-registered","errorCode":null,"errorMessage":"Provider extension \"${providerId}\" not registered","messagePattern":"Provider extension \"(.+?)\" not registered","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/aiCore/src/core/runtime/index.ts","lineNumber":36,"sourceCode":"} from './types'\n\n// === 便捷工厂函数 ===\n\nimport { type AiPlugin } from '../plugins'\nimport { extensionRegistry } from '../providers'\nimport { type CoreProviderSettingsMap, type StringKeys } from '../providers/types'\nimport { RuntimeExecutor } from './executor'\n\n/**\n * 创建运行时执行器 - 支持类型安全的已知provider\n * 自动确保 provider 已初始化\n */\nexport async function createExecutor<\n  TSettingsMap extends Record<string, any> = CoreProviderSettingsMap,\n  T extends StringKeys<TSettingsMap> = StringKeys<TSettingsMap>\n>(providerId: T, options: TSettingsMap[T], plugins?: AiPlugin[]): Promise<RuntimeExecutor<TSettingsMap, T>> {\n  if (!extensionRegistry.has(providerId)) {\n    throw new Error(`Provider extension \"${providerId}\" not registered`)\n  }\n\n  const provider = await extensionRegistry.createProvider(providerId, options || {})\n\n  // Extract model resolver from variant's resolveModel declaration (type-safe at extension level)\n  const resolver = extensionRegistry.getModelResolver(providerId as string)\n  const modelResolver = resolver ? (modelId: string) => resolver(provider, modelId) : undefined\n\n  return RuntimeExecutor.create<TSettingsMap, T>(providerId, provider, options, plugins, modelResolver)\n}\n\n/**\n * Resolves a language model for any provider with its middleware applied.\n *\n * When `plugins` are provided, middleware contributed through\n * `configureContext` is applied to the returned model. This lets independently\n * resolved models, such as retry fallbacks, retain their model-specific\n * adapters.","sourceCodeStart":18,"sourceCodeEnd":54,"githubUrl":"https://github.com/CherryHQ/cherry-studio/blob/726446b54cd69ffe51a276638672f6d95ca0768c/packages/aiCore/src/core/runtime/index.ts#L18-L54","documentation":"createExecutor checks extensionRegistry.has(providerId) before doing anything else; if the id is not registered (by name or alias) it throws immediately, before attempting provider creation. This is the top-level guard for all convenience factories (streamText, generateText, generateImage, embedMany, rerank).","triggerScenarios":"Calling createExecutor (or streamText/generateText/generateImage/embedMany/rerank factory) with a providerId that was never registered and is not an alias — e.g. a typo or a custom provider registered later.","commonSituations":"Typo in provider id; custom extension not yet registered; calling before the initialization module (which runs extensionRegistry.registerAll(coreExtensions)) has loaded; tree-shaking stripping the init side-effect.","solutions":["Check extensionRegistry.has(providerId) (or hasProviderConfig) before calling.","Ensure the initialization module is imported so coreExtensions are registered.","Register custom extensions before use; correct the id or use a known alias."],"exampleFix":"// before\nawait streamText('opena1', { apiKey }, { model: 'gpt-4o', prompt: 'hi' })\n// after\nimport '@cherrystudio/ai-core/provider' // ensures registration\nawait streamText('openai', { apiKey }, { model: 'gpt-4o', prompt: 'hi' })","handlingStrategy":"validation","validationCode":"import { extensionRegistry } from '@cherrystudio/ai-core/provider'\nif (!extensionRegistry.has(providerId)) {\n  throw new Error(`Provider \"${providerId}\" not registered. Available: ${extensionRegistry.getAllProviderIds().join(', ')}`)\n}\nawait createExecutor(providerId, options)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Import the provider initialization module at app entry so coreExtensions register.","Guard against tree-shaking removing the registration side-effect.","Register custom extensions at bootstrap before any factory call."],"tags":["provider","registry","initialization","config"],"backgroundTag":null,"analyzedSha":"726446b54cd69ffe51a276638672f6d95ca0768c","analyzedAt":"2026-08-12T17:30:37.448Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}