{"record":{"id":"e30ebde970192e85","repo":"invoke-ai/InvokeAI","slug":"selected-model-provider-model-config-provider-id","errorCode":null,"errorMessage":"Selected model provider '{model_config.provider_id}' does not match node provider '{self.provider_id}'","messagePattern":"Selected model provider '(.+?)' does not match node provider '(.+?)'","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"invokeai/app/invocations/external_image_generation.py","lineNumber":62,"sourceCode":"    num_images: int = InputField(default=1, gt=0, description=\"Number of images to generate\")\n    width: int = InputField(default=1024, gt=0, description=FieldDescriptions.width)\n    height: int = InputField(default=1024, gt=0, description=FieldDescriptions.height)\n    image_size: str | None = InputField(default=None, description=\"Image size preset (e.g. 1K, 2K, 4K)\")\n    init_image: ImageField | None = InputField(default=None, description=\"Init image for img2img/inpaint\")\n    mask_image: ImageField | None = InputField(default=None, description=\"Mask image for inpaint\")\n    reference_images: list[ImageField] = InputField(default=[], description=\"Reference images\")\n\n    def _build_provider_options(self) -> dict[str, Any] | None:\n        \"\"\"Override in provider-specific subclasses to pass extra options.\"\"\"\n        return None\n\n    def invoke(self, context: InvocationContext) -> ImageCollectionOutput:\n        model_config = context.models.get_config(self.model)\n        if not isinstance(model_config, ExternalApiModelConfig):\n            raise ValueError(\"Selected model is not an external API model\")\n\n        if self.provider_id is not None and model_config.provider_id != self.provider_id:\n            raise ValueError(\n                f\"Selected model provider '{model_config.provider_id}' does not match node provider '{self.provider_id}'\"\n            )\n\n        init_image = None\n        if self.init_image is not None:\n            init_image = context.images.get_pil(self.init_image.image_name, mode=\"RGB\")\n\n        mask_image = None\n        if self.mask_image is not None:\n            mask_image = context.images.get_pil(self.mask_image.image_name, mode=\"L\")\n\n        reference_images: list[ExternalReferenceImage] = []\n        for image_field in self.reference_images:\n            reference_image = context.images.get_pil(image_field.image_name, mode=\"RGB\")\n            reference_images.append(ExternalReferenceImage(image=reference_image))\n\n        request = ExternalGenerationRequest(\n            model=model_config,","sourceCodeStart":44,"sourceCodeEnd":80,"githubUrl":"https://github.com/invoke-ai/InvokeAI/blob/0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06/invokeai/app/invocations/external_image_generation.py#L44-L80","documentation":"This invocation wraps external (third-party hosted) image generation APIs. The node has an optional provider_id input identifying which provider it belongs to. If the user selected a model whose provider_id differs from the node's provider_id, InvokeAI raises ValueError because applying a model from a different provider through this node would be invalid.","triggerScenarios":"Calling invoke() on an ExternalImageGenerationInvocation where self.provider_id is set and context.models.get_config(self.model).provider_id != self.provider_id; also fires if a non-external model was wired in (that raises a different ValueError first).","commonSituations":"Hand-editing or reusing a workflow graph across nodes so the model selector points at a different provider's model; restoring a saved workflow after the model was moved to another provider; copy-pasting nodes without updating the model reference.","solutions":["Open the node in the workflow editor and pick a model whose provider matches the node's provider_id, or clear the provider_id field so any external model is accepted","If building the graph programmatically, set self.model to a key for the same provider as self.provider_id (or set provider_id=None)","Verify the model config with context.models.get_config and confirm isinstance(cfg, ExternalApiModelConfig) and cfg.provider_id == node.provider_id before invoking"],"exampleFix":"# before\nnode.provider_id = 'openai'\nnode.model = 'model-key-for-anthropic-provider'\n# after\nnode.provider_id = 'openai'\nnode.model = 'gpt-image-1'  # key resolving to an ExternalApiModelConfig with provider_id='openai'","handlingStrategy":"validation","validationCode":"cfg = context.models.get_config(node.model)\nassert isinstance(cfg, ExternalApiModelConfig), 'not an external API model'\nif node.provider_id is not None and cfg.provider_id != node.provider_id:\n    raise ValueError(f'{cfg.provider_id} != node provider {node.provider_id}')","typeGuard":"def is_matching_external_model(cfg, provider_id):\n    return isinstance(cfg, ExternalApiModelConfig) and (provider_id is None or cfg.provider_id == provider_id)","tryCatchPattern":"try:\n    out = node.invoke(context)\nexcept ValueError as e:\n    if 'does not match node provider' in str(e):\n        node.model = pick_model_for_provider(node.provider_id)\n        out = node.invoke(context)\n    else:\n        raise","preventionTips":["Always re-pick the model after changing a node's provider_id","Set provider_id=None on generic nodes if any external model is acceptable","Validate provider match when programmatically assembling graphs"],"tags":["validation","model-config","invokeai"],"backgroundTag":"provider-model-mismatch","analyzedSha":"0b6a024f2ff6a86bfb953dcdb9cc504ef7397a06","analyzedAt":"2026-08-29T04:46:49.967Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}