add-ecosystem
Add a new ecosystem and base model to basemodel.constants.ts. Use when onboarding a new model…
Create a Draft CivitaiOfficial model and version through the API, work out whether the version is API-only or needs hosted model files (and either import those from Hugging Face or walk the user through uploading them), update an existing model's description, or transfer a model
$ npx -y skills add civitai/civitai --skill official-model-admin --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/official-model-adminContext preview
The summary Claude sees to decide when to auto-load this skill.
Create a Draft CivitaiOfficial model and version through the API, work out whether the version is API-only or needs hosted model files (and either import those from Hugging Face or walk the user through uploading them), update an existing model's description, or transfer a model
name: official-model-admin description: Create a Draft CivitaiOfficial model and version through the API, work out whether the version is API-only or needs hosted model files (and either import those from Hugging Face or walk the user through uploading them), update an existing model's description, or transfer a model to CivitaiOfficial. Every description write requires the user's approval of the exact text, enforced by an approval hash. Use when setting up an official model or version for review before publishing, or when an official model's description needs to change. Called by onboard-generator-model; usable on its own.
Creates and edits models and versions on the site through the API. **It never publishes.** Everything it creates stays `Draft` until a human publishes it.
node .claude/skills/official-model-admin/model.mjs <command> [flags] node .claude/skills/official-model-admin/model.mjs whoami # API target, your user id, moderator check
Every write is a dry run unless you pass `--writable`. **Ask the user before each `--writable` call.** They write to production.
This applies to `create-model` and `update-description`.
1. Draft the HTML, usually with the `write-model-description` skill, and save it to a scratchpad file. 2. Run the command **without** `--writable`:
3. The dry run ends with an **approval hash**. Ask the user to approve the text **exactly as shown**. If they ask for edits, change the file and run the dry run again, which produces a new hash, then ask again. 4. Once they've approved, re-run with `--writable --approved <hash>`.
The script refuses a hash that doesn't match the current file. For an update, it also refuses if the live description has changed since the dry run. So nothing gets written that the user didn't see.
Every version is one of two kinds, and **the kind has to be settled before `create-version`**:
| Kind | Who runs the model | Files | `usageControl` | Examples | | --- | --- | --- | --- | --- | | `api-only` | the provider, behind its API | none; the upload wizard skips the files step | `ExternalGeneration` | Seedance, Qwen 3, Muse Image, ChatGPT Images, the MiniMax H3 API version | | `hosted-weights` | our cluster, from files on the version | required | `Download`, or `Generation` if downloads shouldn't be offered | Ideogram 4.0, LTXV 2.5, Mage Flow, the MiniMax H3 hosted version |
node .claude/skills/official-model-admin/model.mjs evidence --ecosystem <EcosystemRecord.key> --base-model "<BaseModelRecord.name>"
It reports two things:
Neither is decisive on its own. The base model doesn't settle it, because MiniMax H3 has one version of each kind. Files don't settle it either, because some older `ExternalGeneration` versions have files attached that are never used.
For a **new ecosystem** there is no handler yet. In that case, check `@civitai/orchestration-client`:
Show the user the evidence and your recommendation, then ask the deciding question:
> Does the provider publish weights that we download and run (e.g. on Hugging Face), or is the model only reachable through the provider's own API?
**Never pick the kind silently**, and never pick it from the engine name alone. For hosted weights, also ask whether downloads should be offered. If not, pass `--no-download`, which gives `Generation`.
node .claude/skills/official-model-admin/model.mjs create-version --model-id <id> --name "<Version name>" \ --base-model "<BaseModelRecord.name>" --kind <api-only|hosted-weights> [--no-download] --writable
Two routes. When the weights live on Hugging Face, our servers can fetch them and you attach the result yourself; otherwise the user uploads through the wizard.
Ask the user to queue the repo at **`/moderator/huggingface-import`** — paste the model URL, check the **Group name** (prefilled from the repo; it is what the batch is filed under, and nothing renames it after Import), tick the files, Import. The transfer runs server-side on a cron, so it takes as long as it takes; nothing downloads to anyone's machine. Then:
node .claude/skills/official-model-admin/model.mjs hf-imports --repo <owner/name> node .claude/skills/official-model-admin/model.mjs attach-import --import <id> --version <id> --type Model --fp bf16 --writable
`hf-imports` lists each transferred file with its size, state, group and a sugg
Repo: civitai/civitai
Add a new ecosystem and base model to basemodel.constants.ts. Use when onboarding a new model…
Wire an existing ecosystem into the generation system. Adds generation support to…
Author a prompt-enhancement system prompt for a new ecosystem and register/update it on the…
Add a new trainable base model to BOTH trainers end-to-end — the in-app trainer (main Next.js…
Wire an existing ecosystem into the LoRA training system so it appears as a trainable base…
Deterministically drive a first-party Civitai App Block in the operator's browser and produce…