{"record":{"id":"95dbfb9272f8e8a3","repo":"CherryHQ/cherry-studio","slug":"failed-to-resolve-image-model-modelid-for-prov","errorCode":null,"errorMessage":"Failed to resolve image model: ${modelId} for provider: ${providerId}","messagePattern":"Failed to resolve image model: (.+?) for provider: (.+?)","errorType":"exception","errorClass":"ImageModelResolutionError","httpStatus":null,"severity":"error","filePath":"packages/aiCore/src/core/runtime/executor.ts","lineNumber":332,"sourceCode":"            'All providers should be wrapped with wrapProvider to return V3 models.'\n        )\n      }\n      return modelOrId\n    }\n  }\n\n  /**\n   * 解析图像模型：如果是字符串则创建图像模型，如果是模型则直接返回\n   */\n  private async resolveImageModel(modelOrId: ImageModelV3 | string): Promise<ImageModelV3> {\n    try {\n      if (typeof modelOrId === 'string') {\n        return this.registry.imageModel(`${this.config.providerId}:${modelOrId}` as `${string}:${string}`)\n      } else {\n        return modelOrId\n      }\n    } catch (error) {\n      throw new ImageModelResolutionError(\n        typeof modelOrId === 'string' ? modelOrId : modelOrId.modelId,\n        this.config.providerId,\n        error instanceof Error ? error : undefined\n      )\n    }\n  }\n\n  // === 静态工厂方法 ===\n\n  /**\n   * 创建执行器 - 支持已知provider的类型安全\n   */\n  static create<\n    TSettingsMap extends Record<string, any> = CoreProviderSettingsMap,\n    T extends StringKeys<TSettingsMap> = StringKeys<TSettingsMap>\n  >(\n    providerId: T,\n    provider: ProviderV3,","sourceCodeStart":314,"sourceCodeEnd":350,"githubUrl":"https://github.com/CherryHQ/cherry-studio/blob/726446b54cd69ffe51a276638672f6d95ca0768c/packages/aiCore/src/core/runtime/executor.ts#L314-L350","documentation":"resolveImageModel looks up the image model in the provider registry (registry.imageModel(`${providerId}:${modelId}`)) when a string id is given. If the registry has no such model it throws, and resolveImageModel wraps that in ImageModelResolutionError with the modelId and providerId. This fires before any network call.","triggerScenarios":"Calling generateImage with a string model id that the provider does not expose as an image model — e.g. 'some-text-model' on a provider whose imageModel() throws for that id, or a model id that simply doesn't exist.","commonSituations":"Typo in the image model id; using a chat/embedding model id for image generation; provider doesn't ship imageModel; providerId/modelId mismatch after config change.","solutions":["Confirm the model id is a valid image model for the provider (check provider.imageModel exists for that id).","Pass an already-resolved ImageModelV3 object instead of a string id to bypass registry lookup.","Verify the provider supports image generation (extension supportsImageGeneration)."],"exampleFix":"// before\nawait executor.generateImage({ model: 'gpt-4o', prompt: '...' }) // not an image model\n// after\nawait executor.generateImage({ model: 'dall-e-3', prompt: '...' })\n// or pass a resolved model object\nconst imgModel = provider.imageModel('dall-e-3')\nawait executor.generateImage({ model: imgModel, prompt: '...' })","handlingStrategy":"validation","validationCode":"if (typeof modelOrId === 'string') {\n  try { provider.imageModel(modelOrId) } catch { throw new Error(`\"${modelOrId}\" is not an image model for ${providerId}`) }\n}\nawait executor.generateImage({ model: modelOrId, prompt })","typeGuard":null,"tryCatchPattern":"try {\n  await executor.generateImage({ model: modelId, prompt })\n} catch (e) {\n  if (e instanceof ImageModelResolutionError) {\n    // modelId not an image model — switch to a valid image model id or pass a resolved model object\n  }\n}","preventionTips":["Use a curated list of image model ids per provider.","Pass a resolved ImageModelV3 object when unsure of the id.","Verify supportsImageGeneration on the extension before offering image generation."],"tags":["image-generation","model-resolution","runtime","validation"],"backgroundTag":null,"analyzedSha":"726446b54cd69ffe51a276638672f6d95ca0768c","analyzedAt":"2026-08-12T17:30:37.448Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}