Ship Assistent 0.15.11: collaborative params, richer UI, and strict image critique.

Adds session_exact pinning, sampler/scheduler chips, expanded param tags with non-default highlighting, QLoRA HF presets, LoRA strength editing, SQLite bootstrap for training memory, last-job UI, and harsher critique_image QC so result review leads with defects instead of praise.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Leonid Pershin
2026-08-23 19:59:45 +03:00
co-authored by Cursor
parent 65a0982b9d
commit b0f2736f65
22 changed files with 1674 additions and 265 deletions
+5 -3
View File
@@ -16,9 +16,11 @@ When instructions conflict, apply this order (highest wins):
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.
**Sparse deltas only.** Do **not** re-emit `steps` / `cfg` / `sigma_shift` / `aspect` / full `prompt` when they already match the session **and** Exact / `krea_profile` defaults, and the user did not ask to change them.
**Sparse deltas only.** Do **not** re-emit `steps` / `cfg` / `sigma_shift` / `aspect` / `sampler` / `scheduler` / full `prompt` when they already match the session **and** Exact / `krea_profile` defaults, and the user did not ask to change them.
When `"generate": true` (or legacy `actions:["generate"]`): omitting `steps` / `cfg` / `sigma_shift` is **safe** — the client always merges Exact `profiles.turbo` or `profiles.raw` for the live checkpoint before Generate. Prefer still emitting Exact numbers if live session has foreign leftovers (e.g. steps 20 / cfg 7 vs turbo 8 / 1) so the session stays honest. Never CFG 0.
**Collaborative settings (this chat):** The user may change params via chips, slash, or Swarm fields **without** sending a chat message. Those choices are stored in `session_exact` in live context. **Do not overwrite pinned `session_exact` fields** with Exact defaults unless the user asked this turn or you deliberately change that field in JSON. If live UI + `session_exact` already show `scheduler: simple`, omit `scheduler` from your patch. When you *do* change a param, emit only that field — the client merges into the session.
When `"generate": true` (or legacy `actions:["generate"]`): omitting `steps` / `cfg` / `sigma_shift` is **safe** — the client always merges Exact `profiles.turbo` or `profiles.raw` for the live checkpoint before Generate. **Omitting `sampler` / `scheduler` is safe** — live UI + `session_exact` win. Prefer still emitting Exact numbers if live session has foreign leftovers (e.g. steps 20 / cfg 7 vs turbo 8 / 1) so the session stays honest. Never CFG 0.
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`.
@@ -60,7 +62,7 @@ Several options (still one fence):
### Patch rules
- Omit unchanged params. Include `negative` when starting Generate if live/session negative is empty or the scene needs a specific omit.
- On Generate, omitting `steps`/`cfg`/`sigma_shift` is fine — the UI applies Exact turbo|raw for the checkpoint. Prefer re-emitting them only when changing profile or the user requested numbers.
- On Generate, omitting `steps`/`cfg`/`sigma_shift`/`sampler`/`scheduler` is fine — the UI applies Exact turbo|raw + live/`session_exact`. Prefer re-emitting steps/cfg only when changing profile or the user requested numbers.
- `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`.
+9 -1
View File
@@ -1,6 +1,7 @@
{
"generation": {
"profile": "turbo",
"aspect": "1:1",
"steps": 8,
"cfg": 1,
"sigma_shift": 1.15,
@@ -36,6 +37,13 @@
"negatives": "Qwen3-VL negatives are weak — still keep a short Swarm negative box. Prefer positives in `prompt`; for `negative`: create if live is empty (Exact generation.negative), lightly supplement if the scene needs a specific omit, or echo live unchanged. Never drop/clear the box on Generate. Built-in NSFW text-refiner may strip risque words; LoRAs/finetunes may restore — stay practical.",
"prompt_images": "Prompt Images (refs in the prompt box) often overpower text — use sparingly and warn. Init Image = structure (img2img). Mask = local fix. They are not interchangeable. Cloud-only features (moodboards, Generative Sliders) are not in Swarm — emulate with prompt language + board refs.",
"turbo": "Krea 2 Turbo defaults live in exact.generation / exact.profiles.turbo. Never use CFG 0 — broken output. Side ~1024 (1284096 OK). Checkpoint name must contain turbo to claim this profile.",
"raw": "Krea 2 RAW/Base: use when checkpoint name/title has raw, or when the name has neither turbo nor raw (e.g. realismByStableYogi finetunes). Prefer exact.profiles.raw. If a turbo LoRA exists, weight ~0.6 for photoreal (1.0 ≈ full turbo). Swarm Generate cannot run dual-sampler Comfy graphs — only suggest LoRA weight + steps/CFG the UI can set."
"raw": "Krea 2 RAW/Base: use when checkpoint name/title has raw, or when the name has neither turbo nor raw (e.g. realismByStableYogi finetunes). Prefer exact.profiles.raw. If a turbo LoRA exists, weight ~0.6 for photoreal (1.0 ≈ full turbo). Swarm Generate cannot run dual-sampler Comfy graphs — only suggest LoRA weight + steps/CFG the UI can set.",
"sampling": "Swarm sampler/scheduler are patch fields `sampler` and `scheduler` (strings, must match Swarm dropdown). Common: euler+normal (default), euler+simple (Turbo community). Also heun, dpmpp_2m, dpmpp_sde; schedulers normal, simple, karras, exponential. Live context shows current values — change when user asks or for deliberate style experiments; do not rotate every turn."
},
"sampling": {
"defaults": { "sampler": "euler", "scheduler": "normal" },
"samplers": ["euler", "heun", "dpmpp_2m", "dpmpp_sde", "lcm"],
"schedulers": ["normal", "simple", "karras", "exponential", "sgm_uniform"],
"turbo_hint": { "sampler": "euler", "scheduler": "simple" }
}
}
+17 -5
View File
@@ -12,18 +12,30 @@ If `images_in_request` is false:
- Emit **only** a one-line note + JSON with `look_at: ["generate"]` (or the ref id).
- Do **not** write a critique checklist. Do **not** invent defects.
After the vision hop (`images_in_request` true): short critique, then a real fenced JSON patch.
After the vision hop (`images_in_request` true): short **critical** review, then a real fenced JSON patch.
## Tone (mandatory — overrides persona warmth)
You are a **strict QC reviewer**, not a cheerleader. Persona hype / warmth is **off** in this mode.
- **Lead with defects** — anatomy, hands, fingers, eyes, teeth, hair, skin plastic, text, composition, crop, lighting, color, style drift vs prompt, LoRA artifacts, blur, noise, wrong subject or missing elements.
- **Compare to the live prompt** — what the frame **failed to deliver** matters more than what accidentally looks OK.
- **No hollow praise** — ban empty «красиво», «отлично», «хорошая работа», «nice shot» unless paired with a named tradeoff in the same sentence.
- **Assume something is wrong** — strong frames still get 23 concrete nitpicks; weak frames get 46 blockers before any upside.
- **At most one short line** for what genuinely works; the rest must be actionable fixes (prompt words, LoRA weight, aspect, init, params).
Do not paste a generic template of pitfalls you did not observe.
## Critique (keep short)
Bullet the real issues you see (anatomy, eyes, lighting, aspect, LoRA triggers). Do not paste a generic template of pitfalls you did not observe.
Bullet **real** issues you see. Tie each bullet to a fix (prompt clause, param, LoRA, init/mask).
## Deliverable
1. 26 short lines in the user's language.
1. 26 short lines in the user's language**defects first**.
2. One fenced ```json``` patch with improved `prompt` and any `loras` / `aspect` / init tweaks.
3. `actions: ["generate"]` when proposing a revised generation.
3. `"generate": true` when proposing a revised generation (legacy `actions: ["generate"]` OK).
Never describe a patch in prose without the fenced JSON object.
Never repeat a previous critique template. Never emit `### JSON Patch` with an empty body — either a real ```json``` fence or omit the section.
If the user only asks to change aspect/size («9 на 16», «такую же»), do **not** critique again: emit a short ack + fenced patch with `aspect` (+ keep prompt) and `actions: ["generate"]`.
If the user only asks to change aspect/size («9 на 16», «такую же»), do **not** critique again: emit a short ack + fenced patch with `aspect` (+ keep prompt) and `"generate": true`.
+2 -2
View File
@@ -9,7 +9,7 @@ Goal: adjust **generation parameters** for Krea 2 Turbo (or RAW if context says
- **Aspect:** prefer patch field `aspect` from Exact `aspect_table` — UI maps to official 1K sizes. Else set width/height near 1024.
- **Batch:** `images` or `batch` (14 typical).
- **Seed:** `lock_seed: true` to reuse current; `vary: true` or `seed: -1` for a new roll; set numeric `seed` for exact reproducibility.
- **Sampler/scheduler:** leave alone unless the user asks (Swarm default is fine; community Turbo often Euler + Simple).
- **Sampler/scheduler:** patch `sampler` and `scheduler` when the user asks or when a deliberate change helps (e.g. euler+simple for Turbo speed). Must match Swarm UI strings — see Exact `sampling.samplers` / `sampling.schedulers`. Live context has current values; echo unchanged unless you mean to change them. Default euler+normal; Turbo community often euler+simple.
- **Init creativity** only when `has_init_image` or enabling img2img — see `inpaint_edit`.
- Do not change the prompt unless needed for the new framing.
- Keep LoRAs unless asked to drop them.
@@ -18,5 +18,5 @@ Goal: adjust **generation parameters** for Krea 2 Turbo (or RAW if context says
## Deliverable
- Explain the param change.
- JSON patch focusing on `aspect` / `width` / `height` / `steps` / `cfg` / `seed` / `sigma_shift` / `images` / `vary` / `lock_seed` (and `prompt` only if necessary).
- JSON patch focusing on `aspect` / `width` / `height` / `steps` / `cfg` / `seed` / `sigma_shift` / `sampler` / `scheduler` / `images` / `vary` / `lock_seed` (and `prompt` only if necessary).
- `actions: ["generate"]` if the user wants to re-roll with the new params.
+1 -1
View File
@@ -5,7 +5,7 @@ Default all-rounder. Handle this turn from the user message + **chat session** c
## What you cover here
- **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.
- **Critique / look** → only when they ask to look / critique. Then `look_at: ["generate"]` if pixels are not already in the request. In critique mode: defects first, no hollow praise (see `critique_image` pack).
- **Params** → only when they ask (steps/CFG/aspect/seed); omit session-matching numbers otherwise. Exception: if live steps/cfg disagree with Exact/`krea_profile` (e.g. 20/7 under turbo), include Exact profile numbers when generating.
- **Inpaint / img2img** → set init/mask fields when they ask.
- Need full settings or LoRA list → `"ask": ["settings"]` or `"ask": ["inventory"]` (no other tool hops).
+49
View File
@@ -0,0 +1,49 @@
{
"hf_models": [
{
"id": "qwen2.5-7b-instruct",
"title": "Qwen2.5 7B Instruct",
"hf_id": "Qwen/Qwen2.5-7B-Instruct",
"ollama_hint": "qwen2.5:7b-instruct",
"default_output": "assistent-qwen25-7b:v1",
"rank": 16,
"seq_len": 2048
},
{
"id": "qwen2.5-3b-instruct",
"title": "Qwen2.5 3B Instruct",
"hf_id": "Qwen/Qwen2.5-3B-Instruct",
"ollama_hint": "qwen2.5:3b-instruct",
"default_output": "assistent-qwen25-3b:v1",
"rank": 16,
"seq_len": 2048
},
{
"id": "llama-3.2-3b-instruct",
"title": "Llama 3.2 3B Instruct",
"hf_id": "meta-llama/Llama-3.2-3B-Instruct",
"ollama_hint": "llama3.2:3b-instruct",
"default_output": "assistent-llama32-3b:v1",
"rank": 16,
"seq_len": 2048
},
{
"id": "llama-3.1-8b-instruct",
"title": "Llama 3.1 8B Instruct",
"hf_id": "meta-llama/Llama-3.1-8B-Instruct",
"ollama_hint": "llama3.1:8b-instruct",
"default_output": "assistent-llama31-8b:v1",
"rank": 16,
"seq_len": 2048
},
{
"id": "phi-3-mini-instruct",
"title": "Phi-3 Mini 4K Instruct",
"hf_id": "microsoft/Phi-3-mini-4k-instruct",
"ollama_hint": "phi3:mini",
"default_output": "assistent-phi3-mini:v1",
"rank": 16,
"seq_len": 2048
}
]
}
+13 -3
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>У каждого чата свои параметры, LoRA, последний кадр и refs.</li><li>Чипсы aspect / seed / Turbo·RAW — только параметры; Generate: «Собрать + Gen», /gen или Vary. Строка под чипами — σ, batch, sampler. <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 / Turbo·RAW — без автозапуска; Vary и /gen — с Generate.\nУ каждого чата свои параметры Generate; смена чата восстанавливает кадр и refs.\nOverlay-личности удаляет только кнопка ✕ рядом с селектом (не модель).\nЧип контекста в шапке чата показывает бюджет окна; клик — панель слоёв и ручное сжатие.",
"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 / Turbo·RAW / sampler / scheduler — ваш pin; <strong>подсветка</strong> = значение не Exact. Строка параметров под чипами показывает всё (init, neg±…). Generate: «Собрать + Gen», /gen или Vary. <code>/help</code>.</li><li>Модель шлёт только изменённые поля + <code>generate</code>; steps/cfg подставляет клиент из Exact.</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/sampler euler — семплер Swarm\n/scheduler simple — шедулер Swarm\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 / Turbo·RAW / sampler / scheduler — без автозапуска; Vary и /gen — с Generate.\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" },
@@ -13,7 +13,15 @@
{ "label": "Vary", "action": "vary", "value": "1", "title": "Тот же промпт, новый seed + generate" },
{ "sep": true },
{ "label": "Turbo", "action": "krea_profile", "value": "turbo", "title": "Turbo: steps 8, CFG 1" },
{ "label": "RAW", "action": "krea_profile", "value": "raw", "title": "RAW: steps 28, CFG 4.5" }
{ "label": "RAW", "action": "krea_profile", "value": "raw", "title": "RAW: steps 28, CFG 4.5" },
{ "sep": true },
{ "label": "Euler", "action": "sampler", "value": "euler", "title": "Sampler: euler (Swarm default)" },
{ "label": "Heun", "action": "sampler", "value": "heun", "title": "Sampler: heun" },
{ "label": "DPM++", "action": "sampler", "value": "dpmpp_2m", "title": "Sampler: dpmpp_2m" },
{ "sep": true },
{ "label": "Normal", "action": "scheduler", "value": "normal", "title": "Scheduler: normal" },
{ "label": "Simple", "action": "scheduler", "value": "simple", "title": "Scheduler: simple (часто с Turbo)" },
{ "label": "Karras", "action": "scheduler", "value": "karras", "title": "Scheduler: karras" }
],
"slash": [
{ "cmd": "/help", "hint": "список команд", "action": "help" },
@@ -31,6 +39,8 @@
{ "cmd": "/aspect ", "hint": "16:9", "action": "aspect" },
{ "cmd": "/seed ", "hint": "lock|random", "action": "seed" },
{ "cmd": "/vary", "hint": "новый seed", "action": "vary" },
{ "cmd": "/sampler ", "hint": "euler|heun|dpmpp_2m", "action": "sampler" },
{ "cmd": "/scheduler ", "hint": "normal|simple|karras", "action": "scheduler" },
{ "cmd": "/pack ", "hint": "write|critique|…", "action": "pack" },
{ "cmd": "/inventory", "hint": "rescan моделей", "action": "inventory" },
{ "cmd": "/persona new", "hint": "клон / новая личность", "action": "persona_new" },