Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
title: Managing media generation models
description: Install, add API keys for, edit and maintain image and video models in the Model Manager.
lastUpdated: 2026-10-26
lastUpdated: 2026-11-10
---

import { Card, CardGrid, LinkCard, Steps } from '@astrojs/starlight/components';
Expand Down Expand Up @@ -81,6 +81,8 @@ The Model Manager is for administrators: in [multi-user mode](/configuration/mul

</Steps>

Use **Visit source** on a starter model to open its model page in a new tab. If it has several source pages, choose one from the menu. These links stay in the installed model's details after downloading, including for dependencies installed with it.

Until a model that can generate is installed, the Launchpad's **Home** page says so. Administrators can install the recommended starter bundle there in one click (it says what the bundle suits and links the hardware requirements) or open another bundle in the Model Manager; other users see a notice to ask an administrator. Home also counts installs that failed or need attention, with **Review** to open the install queue.

## Other ways to install
Expand Down
1 change: 1 addition & 0 deletions invokeai/app/api/routers/model_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -1439,6 +1439,7 @@ def _convert_model(key: str, user_id: str) -> AnyModelConfig:
description=model_config.description,
hash=model_config.hash,
source=model_config.source,
source_urls=model_config.source_urls,
),
)
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1912,6 +1912,7 @@ def _register_external_model(self, job: ModelInstallJob) -> None:
key=key,
name=name,
description=job.config_in.description,
source_urls=job.config_in.source_urls or [],
provider_id=provider_id,
provider_model_id=provider_model_id,
capabilities=capabilities,
Expand Down
1 change: 1 addition & 0 deletions invokeai/app/services/model_load/model_load_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"source_type",
"source_api_response",
"source_url",
"source_urls",
"trigger_phrases",
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ def reidentify_model(self, key: str) -> AnyModelConfig:
identified.trigger_phrases = config.trigger_phrases
identified.source = config.source
identified.source_type = config.source_type
identified.source_urls = config.source_urls
if hasattr(config, "cpu_only") and hasattr(identified, "cpu_only"):
identified.cpu_only = config.cpu_only
previous_settings = getattr(config, "default_settings", None)
Expand Down
3 changes: 3 additions & 0 deletions invokeai/app/services/model_records/model_records_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

from invokeai.app.services.shared.pagination import SQLiteDirection
from invokeai.app.util.model_exclude_null import BaseModelExcludeNull
from invokeai.backend.model_manager.configs.base import SourceURL
from invokeai.backend.model_manager.configs.controlnet import ControlAdapterDefaultSettings
from invokeai.backend.model_manager.configs.external_api import (
ExternalApiModelDefaultSettings,
Expand Down Expand Up @@ -87,6 +88,8 @@ class ModelRecordChanges(BaseModelExcludeNull):
source_api_response: Optional[str] = Field(description="metadata from remote source", default=None)
source_url: Optional[str] = Field(description="Optional URL for the model (e.g. download page)", default=None)

source_urls: Optional[list[SourceURL]] = Field(default=None, description="Web pages about the model.")

@field_validator("source_url", mode="before")
@classmethod
def validate_source_url(cls, v: Any) -> Optional[str]:
Expand Down
8 changes: 7 additions & 1 deletion invokeai/backend/model_manager/configs/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@
from inspect import isabstract
from typing import (
TYPE_CHECKING,
Annotated,
Any,
ClassVar,
Literal,
Self,
Type,
)

from pydantic import BaseModel, ConfigDict, Field, Tag, field_validator
from pydantic import BaseModel, ConfigDict, Field, StringConstraints, Tag, field_validator
from pydantic_core import PydanticUndefined

from invokeai.app.util.misc import uuid_string
Expand All @@ -28,6 +29,9 @@
pass


SourceURL = Annotated[str, StringConstraints(pattern=r"^https?://[^\s/?#]+(?:[/?#][^\s]*)?$")]


class Config_Base(ABC, BaseModel):
"""
Abstract base class for model configurations. A model config describes a specific combination of model base, type and
Expand Down Expand Up @@ -82,6 +86,8 @@ class Config_Base(ABC, BaseModel):
description="Optional URL for the model (e.g. download page or model page).",
)

source_urls: list[SourceURL] = Field(default_factory=list, description="Web pages about the model.")

@field_validator("source_url", mode="before")
@classmethod
def validate_source_url(cls, v: Any) -> str | None:
Expand Down
1 change: 1 addition & 0 deletions invokeai/backend/model_manager/configs/factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -886,6 +886,7 @@ def build_common_fields(
fields["hash"] = _overrides.get("hash") or mod.hash()
fields["key"] = _overrides.get("key") or uuid_string()
fields["description"] = _overrides.get("description")
fields["source_urls"] = _overrides.get("source_urls") or []
fields["file_size"] = _overrides.get("file_size") or mod.size()

return fields
Expand Down
18 changes: 18 additions & 0 deletions invokeai/backend/model_manager/starter_models/anima.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
)

anima_vae = StarterModel(
source_urls=["https://huggingface.co/circlestone-labs/Anima"],
name="Anima QwenImage VAE",
base=BaseModelType.Anima,
source="https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/vae/qwen_image_vae.safetensors",
Expand All @@ -20,6 +21,7 @@
)

anima_base = StarterModel(
source_urls=["https://huggingface.co/circlestone-labs/Anima"],
name="Anima Base 1.0",
base=BaseModelType.Anima,
source="https://huggingface.co/circlestone-labs/Anima/resolve/main/split_files/diffusion_models/anima-base-v1.0.safetensors",
Expand All @@ -31,6 +33,7 @@
)

anima_base_int8 = StarterModel(
source_urls=["https://huggingface.co/Bedovyy/Anima-INT8"],
name="Anima Base 1.0 (int8)",
base=BaseModelType.Anima,
source="https://huggingface.co/Bedovyy/Anima-INT8/resolve/d7ba6686f161e9a829373106eb4b881327247ba9/anima-base-v1.0-int8convrot.safetensors",
Expand All @@ -45,6 +48,7 @@
_ANIMA_FP8 = "https://huggingface.co/Bedovyy/Anima-FP8/resolve/3be89fc9843df38b70c2a6be911368536ede31d3"

anima_base_fp8 = StarterModel(
source_urls=["https://huggingface.co/Bedovyy/Anima-FP8"],
name="Anima Base 1.0 (fp8)",
base=BaseModelType.Anima,
source=f"{_ANIMA_FP8}/anima-base-v1.0-fp8.safetensors",
Expand All @@ -62,6 +66,7 @@
)

anima_2_9b = StarterModel(
source_urls=["https://huggingface.co/Gazingstars123/Anima-2.9B"],
name="Anima-2.9B (Preview v1)",
base=BaseModelType.Anima,
source="https://huggingface.co/Gazingstars123/Anima-2.9B/resolve/main/Anima-2.9B-preview-v1.safetensors",
Expand All @@ -75,6 +80,7 @@
)

anima_2_9b_int8 = StarterModel(
source_urls=["https://huggingface.co/Gazingstars123/Anima-2.9B"],
name="Anima-2.9B (Preview v1, int8)",
base=BaseModelType.Anima,
source="https://huggingface.co/Gazingstars123/Anima-2.9B/resolve/main/Anima-2.9B-preview-v1_int8_convrot.safetensors",
Expand All @@ -87,6 +93,7 @@
)

anima_turbo_gguf_q8_0 = StarterModel(
source_urls=["https://huggingface.co/vanes430/Anima-Turbo-V1.1-GGUF"],
name="Anima Turbo 1.1 (GGUF, Q8_0)",
base=BaseModelType.Anima,
source="https://huggingface.co/vanes430/Anima-Turbo-V1.1-GGUF/resolve/main/anima-turbo-v1.1-Q8_0.gguf",
Expand All @@ -100,6 +107,7 @@
)

anima_turbo_int8 = StarterModel(
source_urls=["https://huggingface.co/Bedovyy/Anima-INT8"],
name="Anima Turbo 1.1 (int8)",
base=BaseModelType.Anima,
source="https://huggingface.co/Bedovyy/Anima-INT8/resolve/d7ba6686f161e9a829373106eb4b881327247ba9/anima-turbo-v1.1-int8convrot.safetensors",
Expand All @@ -113,6 +121,7 @@
)

anima_turbo_fp8 = StarterModel(
source_urls=["https://huggingface.co/Bedovyy/Anima-FP8"],
name="Anima Turbo 1.1 (fp8)",
base=BaseModelType.Anima,
source=f"{_ANIMA_FP8}/anima-turbo-v1.1-fp8.safetensors",
Expand All @@ -126,6 +135,7 @@
)

anima_qwen3_5_encoder = StarterModel(
source_urls=["https://huggingface.co/lylogummy/Anima-3.8B"],
name="Anima-3.8B Qwen3.5 4B Encoder",
base=BaseModelType.Any,
source="https://huggingface.co/lylogummy/Anima-3.8B/resolve/main/text_encoders/qwen35_4b.safetensors",
Expand All @@ -136,6 +146,7 @@
)

anima_3_8b = StarterModel(
source_urls=["https://huggingface.co/lylogummy/Anima-3.8B"],
name="Anima-3.8B (v1.1)",
base=BaseModelType.Anima,
source="https://huggingface.co/lylogummy/Anima-3.8B/resolve/main/difussion_models/Anima-3.8B-v1.1.safetensors",
Expand All @@ -149,6 +160,7 @@
)

anima_lllite_inpainting = StarterModel(
source_urls=["https://huggingface.co/kohya-ss/Anima-LLLite"],
name="Anima LLLite Inpainting",
base=BaseModelType.Anima,
source="https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-inpainting-v2.safetensors",
Expand All @@ -158,6 +170,7 @@
)

anima_lllite_sketch = StarterModel(
source_urls=["https://huggingface.co/kohya-ss/Anima-LLLite"],
name="Anima LLLite Sketch",
base=BaseModelType.Anima,
source="https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-any-test-like-v2.safetensors",
Expand All @@ -167,6 +180,7 @@
)

anima_lllite_depth_preview3 = StarterModel(
source_urls=["https://huggingface.co/kohya-ss/Anima-LLLite"],
name="Anima LLLite Depth (Preview3)",
base=BaseModelType.Anima,
source="https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-depth-1.safetensors",
Expand All @@ -176,6 +190,7 @@
)

anima_lllite_scribble_preview3 = StarterModel(
source_urls=["https://huggingface.co/kohya-ss/Anima-LLLite"],
name="Anima LLLite Scribble (Preview3)",
base=BaseModelType.Anima,
source="https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-scribble-1.safetensors",
Expand All @@ -185,6 +200,7 @@
)

anima_lllite_lineart_preview3 = StarterModel(
source_urls=["https://huggingface.co/kohya-ss/Anima-LLLite"],
name="Anima LLLite Lineart (Preview3)",
base=BaseModelType.Anima,
source="https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-lineart-1.safetensors",
Expand All @@ -194,6 +210,7 @@
)

anima_lllite_pose_preview3 = StarterModel(
source_urls=["https://huggingface.co/kohya-ss/Anima-LLLite"],
name="Anima LLLite Pose (Preview3)",
base=BaseModelType.Anima,
source="https://huggingface.co/kohya-ss/Anima-LLLite/resolve/main/anima-lllite-pose-1.safetensors",
Expand All @@ -203,6 +220,7 @@
)

anima_ip_adapter_character_reference = StarterModel(
source_urls=["https://huggingface.co/LuciferTC/Anima-IP-Adapter"],
name="Anima IP-Adapter (Character Reference)",
base=BaseModelType.Anima,
source="https://huggingface.co/LuciferTC/Anima-IP-Adapter/resolve/main/ip_adapter-Character_Reference-10.safetensors",
Expand Down
1 change: 1 addition & 0 deletions invokeai/backend/model_manager/starter_models/cogview4.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

# region CogView4
cogview4 = StarterModel(
source_urls=["https://huggingface.co/THUDM/CogView4-6B"],
name="CogView4",
base=BaseModelType.CogView4,
source="THUDM/CogView4-6B",
Expand Down
Loading
Loading