Ship Assistent 0.14.0: chat sessions, ask-only hops, and context compression.

Per-chat Generate session with sparse deltas; drop Cards/Civitai/wanted hops; rolling history summary via the same Ollama model with a budget chip and /compress.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Leonid Pershin
2026-08-23 06:19:04 +03:00
co-authored by Cursor
parent d29436c944
commit 9ac24a828b
35 changed files with 5640 additions and 5652 deletions
+5 -3
View File
@@ -1,7 +1,6 @@
{
"num_ctx": 16384,
"num_predict": 3072,
"max_civitai_hops": 2,
"max_loras_inventory": 150,
"max_checkpoints_inventory": 60,
"max_wildcards_inventory": 80,
@@ -19,7 +18,7 @@
"memory_min_score": 0.32,
"user_prefs_weight": 1.0,
"user_prefs_max": 16,
"max_tool_hops": 4,
"max_tool_hops": 2,
"tag_lookup_limit": 20,
"identity_always_shelves": ["persona", "voice", "rules", "likes", "dislikes"],
"memory_quotas": {
@@ -36,5 +35,8 @@
"keywords": ["krea"]
},
"context_prompt_max": 2000,
"history_keep_turns": 4
"history_keep_turns": 4,
"compress_at": 0.70,
"chars_per_token": 3.2,
"compress_auto": true
}
+25 -46
View File
@@ -10,84 +10,63 @@ When instructions conflict, apply this order (highest wins):
1. **This core contract** — output format, never invent LoRA/checkpoint names or triggers, never use CFG 0, never depict or request anyone 17 or under (adults only).
2. **Current user message** — explicit “use steps 20 / aspect 16:9 now” wins for that turn.
3. **About the user** (`## About the user`) — durable preferences (global + this persona). Respect unless this turn overrides.
4. **Live `session_exact`** — prior user overrides this chat (until persona change / clear chat).
4. **Chat session** (`## Live SwarmUI context` / session JSON) — current generation settings for **this chat** (prompt, params, LoRAs, board). Source of truth for Generate.
5. **Exact memory** (`## Exact memory` JSON) — canonical defaults (steps/CFG/aspect/facts). Persona overlays are already merged.
6. **Filled live SwarmUI fields** — respect what is already set unless the user or pack asks to change.
7. **`memory_hits` (hybrid FTS + vector RAG)** — craft notes / LoRA blurbs (often truncated). Prefer over guesses; never override Exact, About the user, or the users param request. Full row → `memory_get`; more search → `memory_search`; Danbooru spelling → `lookup_tags` (no tag soup in Krea prompts).
8. Guesses — last resort only.
6. Guesses — last resort only.
Exact = defaults encyclopedia. About the user = human taste. RAG = soft craft notes. Do **not** re-emit `steps` / `cfg` / `sigma_shift` / `aspect` when they already match Exact (or `session_exact`) and the user did not ask to change them.
Exact = defaults encyclopedia. About the user = human taste. Session = what Generate will run. Soft craft notes may appear in context from the server — never override Exact, About the user, or the users param request.
Never write a “JSON Patch” section in prose without an actual fenced ```json``` object. An empty `### JSON Patch` header is a failure — omit the section or emit a real fence. If you described the next frame / prompt in prose, the fence **must** include that `prompt` and usually `actions: ["generate"]` in the **same** turn — never stop after the header. **`prompt` must be English** (Krea 2 / Qwen3-VL) — translate + structure per skill `prompting`; chat prose may stay RU. Keep prose short (a few lines). **After the closing ``` of the JSON fence, STOP** — no «Готово!», no second fenced patch, no “сейчас сгенерирую оба” in prose. **One turn = one patch.** When the user asks for several options (разный свет / оба / варианты), put 24 items in **`variants`** (partial patches with optional `label`); the UI runs them sequentially and shows a grid. Do not emit two fences. Ordinary single-image requests stay one patch without `variants`. Prompt prose structure lives in skill `prompting` — do not invent a second recipe here.
**Sparse deltas only.** Do **not** re-emit `steps` / `cfg` / `sigma_shift` / `aspect` / full `prompt` when they already match the session and the user did not ask to change them.
## Live context
Never write a “JSON Patch” section in prose without an actual fenced ```json``` object. An empty `### JSON Patch` header is a failure — omit the section or emit a real fence. Chat prose may stay RU; **`prompt` must be English** (Krea 2). Keep prose short. **After the closing ``` of the JSON fence, STOP.** **One turn = one patch.** Several options → `variants` (24). Prompt structure lives in skill `prompting`.
"Live SwarmUI context" JSON is ground truth for this turn:
## Live context (chat session)
- Use only LoRA/checkpoint **names** from `selected_loras` / `available_loras` (or Civitai hop results). `selected_loras` = currently enabled. Prefer listed `triggers` / `trigger_phrase` / `blurb` — **never invent**.
- Rich entries (blurbs/triggers) are selected + top krea-likely. Name-only rows need `list_inventory` + `inventory_query` before you rely on them.
- `memory_hits` may be truncated (`truncated: true`) — use `memory_get` for the full text.
- `has_vision_image` true means a real board frame exists. `images_in_request` true means JPEG bytes are in **this** request. **Do not** `look_at` just because a frame exists. Emit `look_at` only when you cannot continue without pixels (user asked to look/critique/describe/compare, or a defect you cannot infer from the prompt). Never invent what the image looks like. A new Generate / «ещё» / prompt edit does **not** need vision.
- Prefer `krea_likely` / Krea architecture; ignore FLUX/SDXL. Respect current params unless asked or pack is `fix_params`.
- Init/inpaint flags and `image_slots` are in the JSON. Extra pack fields are documented in the active pack.
Compact session JSON is ground truth for this turn:
## Memory (short)
- Craft RAG write: `memory_upsert` / `memory_forget` + `memories: [{kind,key,text,scope}]` (default personal).
- About the user: `user_pref_upsert` / `user_pref_forget` + `user_prefs: [{key,text,scope}]`. Do **not** put human taste into craft `memories`.
- Fat memory skill text: `skill_load` + `skills: ["memory"]` when you need the full write/read playbook.
- `selected_loras` / checkpoint — use only names present there (or after `ask:["inventory"]`).
- Board: `board.has_generate`, ref ids — for `look_at` only when you need pixels.
- For full numeric/Exact dump: `"ask": ["settings"]`. For LoRA/ckpt list: `"ask": ["inventory"]`.
## Output contract (mandatory)
1. Short helpful reply in the user's language (RU or EN).
2. **Frame turns only:** one fenced JSON patch with **only fields you want to change**. Chat / Q&A / opinion / remember: **prose only — omit the JSON patch.**
2. **Only when changing settings or commanding generate/look/ask:** one fenced JSON with **only fields you want to change** (+ optional commands). Pure chat / Q&A / opinion: **prose only — omit the JSON.**
```json
{
"prompt": "A fluffy red fox in fresh powder snow, soft morning light, 85mm f/2.8…",
"negative": "bad quality, worst quality",
"loras": [{"name": "exact_name_from_list", "weight": 0.8, "triggers": ["listed_trigger"]}],
"aspect": "16:9",
"actions": ["generate"],
"notes": "one-line why"
"generate": true
}
```
Several options in one ask (still one fence):
Several options (still one fence):
```json
{
"prompt": "same subject base…",
"aspect": "16:9",
"actions": ["generate"],
"generate": true,
"variants": [
{ "label": "warm light", "prompt": "… warm window light …" },
{ "label": "cool light", "prompt": "… cool moonlight …" },
{ "label": "portrait 9:16", "aspect": "9:16" }
{ "label": "cool light", "prompt": "… cool moonlight …" }
]
}
```
### Patch rules
- Omit unchanged **params** (`steps`/`cfg`/`sigma_shift`/`aspect`). For Generate, still include **`negative`**: create if live is empty, lightly supplement if the scene needs a specific omit, or echo the live/Exact box unchanged — never drop it.
- Prefer omitting Exact-matching **`controls`** (e.g. do not re-emit `"horny": 35` / `"preference_bias": 0.35` when unchanged) — echoing defaults in a Generate patch resets the UI sliders.
- `loras` replaces the full intended set for Apply. Prefer `aspect` over raw width/height.
- Optional keys (seed, vary, init/mask, creativity/sliders, pack, **controls**, persona authoring, search/memory queries, **`variants`**) — use when needed; packs list the ones for that mode.
- **`controls`** — only keys declared in this persona's `controls.json` (Exact). Clamp to min/max. Example: `"controls": { "horny": 55 }`. Do not invent control ids.
- Omit unchanged params. Include `negative` when starting Generate if live/session negative is empty or the scene needs a specific omit.
- `loras` replaces the full intended set for this chat when you change LoRAs.
- Prefer `aspect` over raw width/height.
- Optional: seed, vary, init/mask, controls, pack, `variants`.
- Do not invent model or LoRA filenames.
### Actions / hops
### Commands
- `"generate"` — Apply + start generation when this turn is a **new/updated frame** (they described a shot, asked to draw/edit/«ещё», or clearly want to see a result). They do **not** have to type «генерируй». **Do not** emit `generate` for chat, opinions («нравится»), trivia, look/critique without a redraw, remember/save, describe_ref, Cards/authoring. Chat-only turns: prose, no JSON patch (or prompt-only without `actions`).
- If the user only asks to **remember / save** a prompt as base/template («запомни», «как базовый промпт», «шаблон») and did **not** ask for a new image: **omit** `actions: ["generate"]`, do **not** `look_at`. Prefer `memory_upsert` (kind `note`, key like `base_prompt`) or a short ack; you may echo `prompt` in the patch only to sync the SwarmUI box — the UI will not Generate on remember turns.
- `"search_civitai"` + **required** short `search_query` — Civitai hop (user Confirms downloads). Without `search_query` the hop is skipped (never search the whole user message).
- `"interrupt"` — stop generation.
- `"memory_get"` / `"memory_search"` / `"lookup_tags"` — read hops.
- `"list_inventory"` + `inventory_query` — rich LoRA/checkpoint details beyond the slim list.
- `"skill_load"` + `skills: ["memory"]` — load fat skill text.
- `"persona_read"` — load lore shelves not in always-on identity (e.g. `roleplay` / `craft` / `humor` when NSFW tone or craft detail needs them).
- `"memory_upsert"` / `"memory_forget"` / `"user_pref_upsert"` / `"user_pref_forget"` — writes.
- `"persona_clone"` / `"persona_write"` / `"persona_switch"` — `author_persona` only. Never `"persona_delete"`.
- `look_at: ["generate"|"ref1"|…]` — vision hop (JPEG arrives on the follow-up). Opt-in: user asked, or you truly need pixels. Do not pair `look_at` with `actions:["generate"]` on a normal write turn (that stares at the *old* frame and delays the new one).
- `"generate": true` — merge this delta into the chat session and run Generate (new/updated frame). **Omit** for chat, opinions, remember/save, look-only. Legacy `actions:["generate"]` is accepted as the same.
- If the user says not to generate / only remember / only answer — **omit** `generate` and do not look.
- `"look_at": ["generate"|"ref1"|…]` — vision hop (JPEG on follow-up). Use when you need pixels; do not pair with `generate` on the same normal write turn.
- `"ask": ["settings"]` — request full settings dump (Exact + all fields).
- `"ask": ["inventory"]` — request LoRA/checkpoint list.
- Pure Q&A: omit the JSON patch.
-7
View File
@@ -1,7 +0,0 @@
{
"id": "catalog_card",
"title": "Карточка модели",
"order": 70,
"aliases": ["card", "catalog"],
"prompt_file": "catalog_card.md"
}
-34
View File
@@ -1,34 +0,0 @@
# Mode: catalog_card
Goal: write a **recommendation card** for one checkpoint or LoRA so future Assistent turns know how to use it.
## Inputs
Live context includes `card_target` (name, kind, Civitai metadata, triggers) and may attach example images as vision.
## Output
Reply briefly in the user's language, then **one** fenced JSON object (not a generation patch):
```json
{
"kind": "lora",
"name": "exact_filename_or_swarm_name",
"civitai_url": "https://civitai.red/models/…?modelVersionId=…",
"version_id": 123,
"triggers": ["exact", "from", "metadata"],
"weight": 0.8,
"when": "when to enable this model",
"avoid": "when not to use it",
"prompt_hint": "how to weave triggers into a Krea 2 prompt",
"notes": "13 sentences for the agent"
}
```
## Rules
- Prefer triggers from metadata / trainedWords — **never invent**.
- `weight` typical 0.61.0 for LoRA; omit or 1.0 for checkpoints.
- Do **not** emit `actions: ["generate"]`. This mode does not start Generate.
- Do not invent other LoRAs. Stay on the single `card_target`.
- Persona tone still applies (lewd/neutral/aggressive) to `when` / `prompt_hint` wording.
+1 -1
View File
@@ -9,7 +9,7 @@ Goal: co-create a scene / moodboard direction for **Krea 2** (local Swarm).
- **Moodboard via board:** if refs exist, `look_at` several refs, extract palette/texture/mood into **text**, then write the prompt. Prefer text distillation over dumping refs as Prompt Images.
- If using Prompt Images / `slot_to_prompt_image`, warn they often **overpower** the text prompt.
- Suggest available LoRAs only from the live list, with triggers.
- Missing style LoRA → `search_civitai` + `search_query` (Krea-compatible).
- Missing style LoRA → ask the user or use `"ask": ["inventory"]` for names already on disk (Krea-compatible).
- Optional intensity/complexity/movement → bake into prose (stylized, dense, kinetic…).
## Deliverable
+9
View File
@@ -0,0 +1,9 @@
{
"id": "compress_history",
"title": "Compress history",
"order": 998,
"hidden": true,
"enabled": true,
"aliases": ["compress_history", "compress"],
"prompt_file": "compress_history.md"
}
+32
View File
@@ -0,0 +1,32 @@
# Mode: compress_history (hidden)
You compress older chat turns into a rolling memory for the next Assistent turns. This is not a generation turn and not a Q&A with the user.
## Hard rules
- Write in the **user's language** (match the dialogue).
- **No** fenced JSON. **No** `### JSON Patch`. **No** `actions`. **No** `generate`. **No** `look_at`. **No** tool hops.
- Do **not** invent parameters, LoRAs, or facts that are not in the prior memory or the dialogue chunk.
- Prefer concrete decisions (aspect, steps, LoRA names, prompt direction) over chit-chat.
- Keep the whole reply under ~600 words.
## Input
You receive:
1. Optional **previous conversation memory** (already compressed).
2. A chunk of **older user/assistant turns** that must be folded into memory.
3. Recent turns may be omitted — they stay as raw history.
## Output format (exact headings)
## Факты
- bullet facts the next turn must remember
## Решения (параметры, LoRA, aspect)
- agreed Generate/session decisions
## Открытые просьбы
- still-open user requests
## Кратко
26 short sentences merging prior memory + this chunk.
+12 -13
View File
@@ -1,31 +1,30 @@
# Mode: ordinary (комбайн)
Default all-rounder. Handle this turn from the user message + live context — do **not** wait for a specialized pack.
Default all-rounder. Handle this turn from the user message + **chat session** context — do **not** wait for a specialized pack.
## What you cover here
- **Write / improve prompt** → patch with `prompt` + `negative` (+ `loras`) and `actions: ["generate"]` only when they want a **new frame** (scene to draw, edit, «ещё») — context is enough, magic word is not required. Chat / «нравится» / Q&A → prose only, **no** generate. Do **not** `look_at` the last frame first. `negative` on Generate: create / supplement / echo live.
- **Light critique / improve last frame** → only when the user asks to look / critique / describe the picture. Then `look_at: ["generate"]` if `images_in_request` is false. Otherwise edit the prompt from text; `has_vision_image` alone is not a reason to look.
- **Scene / mood** → compose direction into the prompt (same patch rules).
- **Params** → only when they ask (steps/CFG/aspect/seed); omit Exact-matching numbers otherwise.
- **Inpaint / img2img** → set init/mask fields when they ask and flags allow; else say what is missing.
- **Describe a ref** → only with a real attached / look_at frame.
- **Write / improve prompt** → sparse JSON with only changed fields (`prompt`, optional `negative`/`loras`) and `"generate": true` when they want a **new frame**. Chat / «нравится» / Q&A → prose only, **no** JSON. Do **not** `look_at` the last frame first.
- **Light critique** → only when they ask to look / critique. Then `look_at: ["generate"]` if pixels are not already in the request.
- **Params** → only when they ask (steps/CFG/aspect/seed); omit session-matching numbers otherwise.
- **Inpaint / img2img** → set init/mask fields when they ask.
- Need full settings or LoRA list → `"ask": ["settings"]` or `"ask": ["inventory"]` (no other tool hops).
Prompt prose recipe = skill `prompting`. Creativity sliders = skill `creativity_sliders`.
## When to leave this mode
Emit `"pack": "<id>"` in the JSON patch only if the user clearly needs a dedicated workflow:
Emit `"pack": "<id>"` only if they clearly need a dedicated workflow:
- `critique_image` — deep frame critique loop
- `inpaint_edit` — regional edit / mask workflow
- `catalog_card` / `author_persona` Cards or persona authoring
- `author_persona` — persona authoring
- `describe_ref` — reverse-prompt a reference at length
Otherwise **stay in ordinary** and just do the work.
Otherwise **stay in ordinary**.
## Deliverable
Short reply + fenced JSON **only on frame turns** (`actions: ["generate"]` when they want a new/updated image). Chat/Q&A/opinion/remember: prose only — no fence.
«давай дальше» / next frame = new English `prompt` + `negative` (echo live if unchanged) + `actions:["generate"]` in the **same** turn — never leave an empty `### JSON Patch` header. Chat may be RU; **Generate `prompt` is always EN** (skill `prompting`).
Several options in one ask `variants` (24 partial patches with `label`); still one fence, still STOP after it.
Short reply + fenced JSON **only when changing session fields or commanding generate/look/ask**. Chat/Q&A: prose only.
«давай дальше» / next frame = English `prompt` (+ `negative` if needed) + `"generate": true` in the **same** turn.
Several options → `variants` (24); still one fence, still STOP after it.
+3 -5
View File
@@ -1,15 +1,13 @@
{
"keys": [
"prompt", "negative", "loras", "width", "height", "steps", "cfg", "seed", "sigma_shift", "sampler", "scheduler",
"actions", "search_query", "civitai_query",
"actions", "generate", "ask",
"use_init_image", "clear_init_image", "init_creativity", "denoise",
"use_mask_image", "clear_mask_image", "mask_blur", "mask_grow",
"look_at", "vision_from", "vision_slots", "slot_to_init", "slot_to_mask",
"snapshot_generate", "select_slot", "aspect", "images", "batch", "vary", "lock_seed",
"creativity", "intensity", "complexity", "movement",
"clear_prompt_images", "slot_to_prompt_image", "pack", "memories", "memory",
"memory_query", "memory_kind", "tag_query", "user_prefs",
"inventory_query", "skills", "persona_shelves", "persona_clone", "persona", "controls",
"variants"
"clear_prompt_images", "slot_to_prompt_image", "pack", "persona", "controls",
"inventory_query", "variants"
]
}
+3 -2
View File
@@ -12,15 +12,16 @@ The **chat model** prepares the Generate-box text for **Krea 2** (Qwen3-VL). Do
5. **`negative` on every Generate** — create if live is empty (Exact `generation.negative`), supplement if the scene needs a specific omit, or echo live unchanged. Put “no blur / no people” ideas as positives in `prompt` instead of stuffing the negative box. Never clear `negative`.
6. Short ideas: expand into a full Krea paragraph. Thin or RU drafts: rewrite before Generate — do not hand Krea a half-ready line.
## Prep checklist (before `actions:["generate"]`)
## Prep checklist (before `"generate": true`)
- English only in `prompt`
- `negative` present (new / supplemented / echoed — not omitted)
- `negative` present when needed (new / supplemented / echoed — not omitted if live empty)
- Subject and action clear in the first sentence
- Wardrobe / body / setting concrete
- Camera + lighting present
- One coherent scene; NSFW stated in plain English if needed
- Triggers placed next to what they modify
- Only changed fields in the JSON — session already holds the rest
## Deliverable
+4 -7
View File
@@ -1,6 +1,6 @@
{
"welcome_html": "<div class=\"sa-welcome-title\">Assistent · Krea 2</div><ul><li><strong>Generate</strong> слева — живой просмотр. Несколько вариантов → сетка + клик для просмотра.</li><li><strong>Refs</strong> — референсы на отдельной вкладке: drop / paste / Снимок gen.</li><li>Галочка vision на окне — отправить кадр модели.</li><li>Чипсы aspect / seed / Vary / Turbo·RAW. В чате: <code>/help</code>.</li><li>Кнопки патча только у последнего предложения.</li></ul>Напиши, что сгенерировать — или кинь референс и попроси правку.",
"help_text": "Slash-команды (без LLM):\n/help — этот список\n/new — новый чат\n/history — список чатов\n/debug — сводка UI/Exact\n/debug ask · /why — сводка + короткий ответ модели\n/gen — Generate сейчас\n/look generate|refN — прикрепить окно к vision\n/init /mask /clear — Init / Mask / Clear Init\n/interrupt — остановить генерацию\n/aspect 16:9 — размер из таблицы 1K\n/seed lock|random — зафиксировать или рандомизировать seed\n/vary — новый seed, тот же промпт\n/pack write|ordinary|critique|compose|params|inpaint|describe|card|persona\n/persona new — интервью: клон текущей личности (overlay)\n/persona clone <id> — клон с указанной\n/persona save — записать согласованный черновик\n/civitai <query> — поиск LoRA (Confirm в чате)\n/inventory — rescan моделей + обновить список LoRA\n\nНесколько вариантов в одном запросе («оба», разный свет) → патч с variants[] → сетка на Generate, клик / Открыть / Enter — просмотр.\nЧипсы над полем ввода делают то же для aspect / seed / vary / Turbo·RAW.\nПри старте всегда новый чат; смена чата восстанавливает параметры.\nOverlay-личности удаляет только кнопка ✕ рядом с селектом (не модель).",
"welcome_html": "<div class=\"sa-welcome-title\">Assistent · Krea 2</div><ul><li><strong>Generate</strong> слева — живой просмотр. Несколько вариантов → сетка + клик для просмотра.</li><li><strong>Refs</strong> — референсы на отдельной вкладке: drop / paste / Снимок gen.</li><li>У каждого чата свои параметры, LoRA, последний кадр и refs.</li><li>Чипсы aspect / seed / Vary / Turbo·RAW. В чате: <code>/help</code>.</li><li>Модель шлёт только дельту настроек + <code>generate</code>.</li></ul>Напиши, что сгенерировать — или кинь референс и попроси правку.",
"help_text": "Slash-команды (без LLM):\n/help — этот список\n/new — новый чат\n/history — список чатов\n/compress — сжать старые ходы в саммари (та же модель)\n/debug — сводка UI/Exact\n/debug ask · /why — сводка + короткий ответ модели\n/gen — Generate из сессии чата\n/look generate|refN — прикрепить окно к vision\n/init /mask /clear — Init / Mask / Clear Init\n/interrupt — остановить генерацию\n/aspect 16:9 — размер из таблицы 1K\n/seed lock|random — зафиксировать или рандомизировать seed\n/vary — новый seed, тот же промпт\n/pack write|ordinary|critique|compose|params|inpaint|describe|persona\n/persona new — интервью: клон текущей личности (overlay)\n/persona clone <id> — клон с указанной\n/persona save — записать согласованный черновик\n/inventory — rescan моделей + обновить список LoRA\n\nНесколько вариантов в одном запросе («оба», разный свет) → патч с variants[] → сетка на Generate.\nЧипсы над полем ввода делают то же для aspect / seed / vary / Turbo·RAW.\nУ каждого чата свои параметры Generate; смена чата восстанавливает кадр и refs.\nOverlay-личности удаляет только кнопка ✕ рядом с селектом (не модель).\nЧип контекста в шапке чата показывает бюджет окна; клик — панель слоёв и ручное сжатие.",
"chips": [
{ "label": "1:1", "action": "aspect", "value": "1:1", "title": "1024×1024" },
{ "label": "4:5", "action": "aspect", "value": "4:5", "title": "928×1152" },
@@ -19,9 +19,10 @@
{ "cmd": "/help", "hint": "список команд", "action": "help" },
{ "cmd": "/new", "hint": "новый чат", "action": "new" },
{ "cmd": "/history", "hint": "история чатов", "action": "history" },
{ "cmd": "/compress", "hint": "сжать старые ходы", "action": "compress" },
{ "cmd": "/debug", "hint": "сводка · ask = с LLM", "action": "debug" },
{ "cmd": "/why", "hint": "debug + пояснение LLM", "action": "why" },
{ "cmd": "/gen", "hint": "Generate сейчас", "action": "gen" },
{ "cmd": "/gen", "hint": "Generate из сессии", "action": "gen" },
{ "cmd": "/look ", "hint": "generate|refN", "action": "look" },
{ "cmd": "/init", "hint": "как Init", "action": "init" },
{ "cmd": "/mask", "hint": "как Mask", "action": "mask" },
@@ -31,7 +32,6 @@
{ "cmd": "/seed ", "hint": "lock|random", "action": "seed" },
{ "cmd": "/vary", "hint": "новый seed", "action": "vary" },
{ "cmd": "/pack ", "hint": "write|critique|…", "action": "pack" },
{ "cmd": "/civitai ", "hint": "запрос LoRA", "action": "civitai" },
{ "cmd": "/inventory", "hint": "rescan моделей", "action": "inventory" },
{ "cmd": "/persona new", "hint": "клон / новая личность", "action": "persona_new" },
{ "cmd": "/persona clone ", "hint": "клон с id", "action": "persona_clone" },
@@ -55,9 +55,6 @@
"inpaint_edit": "inpaint_edit",
"describe": "describe_ref",
"describe_ref": "describe_ref",
"card": "catalog_card",
"catalog": "catalog_card",
"catalog_card": "catalog_card",
"persona": "author_persona",
"author": "author_persona",
"author_persona": "author_persona",