Commit Graph
813 Commits
Author SHA1 Message Date
DemonGatanjieuandClaude Opus 5.5 72d3ca12ea Fix saves: run each save, not the canvas; keep Ctrl+Z after going back
ComfyUI-Manager wraps app.graphToPrompt and drops the graph, so every run and
the check before it compiled the canvas: same seeds, nothing of the later marks.
A result that is not the copy's is now made by ComfyUI's own method.

Going back is one of ComfyUI's undo steps, so Ctrl+Z returns to the state left
behind. A save can also open on a new tab, the empty canvas's menu and a + on
the bar keep one, and marks show as saves, runs counted as runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 15:46:27 +08:00
DemonGatanjieuandClaude Opus 5.5 537ebc46d7 Make the new-route reminder say try it, not change models
A Flash exam showed a light model can build a route it is told, so the reminder
no longer sends the user to a flagship model: the route is untried, see how the
run turns out, and save a card if it is good.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 14:12:50 +08:00
DemonGatanjieuandClaude Opus 5.5 64607a2c19 Add the snapshot queue: marks of a whole workflow run in order
A node's "Mark this state" keeps the serialized canvas as a mark in a bar
under it. A mark's number goes back to that state, each has its runs, and
seeds are Random or Locked (one per round, shared by the marks; a fixed
seed alone would come from ComfyUI's cache). Run checks every mark with
validate_prompt first, then compiles detached copies with their seeds
written, so the canvas and its seeds stay as they are.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 11:38:23 +08:00
DemonGatanjieuandClaude Opus 5.5 5e32f247b7 Routes for two picked models; a reminder when the AI builds a new route
With two main models picked, ask_user(routes=true) shows the routes this
ComfyUI can build for them, each with what it does to the picture and a
sample, a saved card using both first; the answer says what to call, and
add_nodes(route=...) builds the route from the ways on a new tab, the LoRAs
on each model. get_toolbox lists each model's cards as its examples. A way
counts as ready when a family variant has what it needs. An AI placing
nodes itself is a new route: one reminder a task, or with the new gate the
user's OK.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 11:27:09 +08:00
DemonGatanjieuandClaude Opus 5.5 eab141f971 Merge the upscale ways into three; repaint is one use for the AI
Upscale held by Tile takes in the tile upscale, the Anima Tile detail
upscale and the second-model upscale: its redraw has its own copy of the
canvas's model line (copy_of "$sampler.model": loader and LoRAs, titled
"Upscale model"), so a second model is one set_model and the LoRAs stay;
on Anima it is the user's tested route (latent 1.22x, Tile LLLite,
denoise 0.85). The iterative upscale goes. add_nodes no longer lists every
block name, and the repaint hints name the use, not a block.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 02:32:09 +08:00
DemonGatanjieuandClaude Opus 5.5 9f72cfce83 Pick a base: run the first pass alone as previews, keep the one picked
run_workflow(base_only) queues the first pass alone (base_only.js cuts each
queued prompt; save nodes become previews, the canvas stays). When it ends,
ai_bases.py shows the previews on a picks panel; the picked one is copied
into the output folder and its seed held. The next run takes the kept
picture where the rest takes the base's picture, so the base is not drawn
again; a base handed on as a latent (mid-way switch) is drawn again from
its seed and compared with the kept one. Drawn again from the same seed, a
base once came out grainy on a 6 GB card, hence the kept picture.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 00:17:42 +08:00
DemonGatanjieuandClaude Opus 5.5 a127987348 Current node: compare the node alone, the models page's cards in the picker, no click-through
Three fixes from the user's use of the current-node panel:

- ⇄ Compare on a saved set listed the whole workflow's values. It now
  compares that node alone: a copy of the node holding the set's values,
  nothing wired, against the canvas, under the node's id so the two pair
  (a set's workflow numbered otherwise, with two prompt nodes, paired
  neither). compareParams takes `only` for this; the comparison window
  takes `nodeId` and leaves out the structure badge. Every set can now be
  compared; the unused "could not read the set's workflow" text is gone.
- The Change model picker drew cards of its own: full-size covers and
  videos without a still, so most showed blank, and only file names. It
  now shows the models page's card face (modelCardFace, split out of
  ui_grid.js): the cover thumbnail, a video's still until pointed at, the
  base badge, version, readable name and file name; "current" and the
  chosen outline stay. Versions are not folded. Its type and base chips
  and their texts are gone.
- In the generated-pictures gallery (current node, View all), once
  scrolled, "Close gallery" opened the picture scrolled up under it:
  Chrome's hit-testing again (lessons.md). Its scroll box and the
  picker's card area get clip-path: inset(0).

Checked in an isolated ComfyUI: the prompt node's compare lists only its
text; the picker shows covers and names, selects, replaces; the models
page's cards keep their buttons and open the details; a 13-step scroll
of the gallery leaves every click on the close button. Full suite and
structure check pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 02:41:52 +08:00
DemonGatanjieuandClaude Opus 5.5 0bed7973e0 Add a mid-way model switch way; the model-switch ways work on Anima
New way switch_midway (refine, want midway): the canvas's sampler becomes
two KSampler Advanced parts, the first on the canvas's model up to step
21, the second on a new loader from there, taking the old sampler's place
and links. On Anima it takes the tested sampling (35 steps,
dpmpp_2m_sde_gpu, beta): er_sde comes out grainy when split, even with
the same model in both parts, which the AI is told.

refine_other_model and upscale_two_models get Anima variants: a UNET
loader "like" the canvas's, reusing its text encoder, VAE and prompts; on
Anima the second-model upscale is the Tile route the user verified (1.22x
latent, LLLite 0.7, denoise 0.85, ColorMatch).

A node "like" or replacing a sampler now takes its seed as noise_seed on
KSampler Advanced and the other way round. The scene argument's
description is shorter to keep the tool list within its budget.

Ran on the isolated test ComfyUI on an Anima canvas: each way built
through add_nodes and made a picture (79 s, 148 s, 127 s on 6 GB).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 22:24:58 +08:00
DemonGatanjieuandClaude Opus 5.5 186f5467b0 Lay a workflow's details out as flow, preset tabs and the preset shown
The left column is gone. The details are one column: the flow, a row of
tabs under it (the workflow's own values, each preset with how many
values it changes, + to save the canvas or copy the one shown, all
pictures and versions at the end; it stays in view while the panel
scrolls) and the tab chosen in a panel joined to it.

The flow is small and shows only the structure: the stages in the order
they run, then the finishing nodes and the saves; above them one lane
each for the model files, the LoRAs and the control models, each a bar
over the stages it feeds (recipe_flow.flowLanes, tested). Steps, splits
and strengths moved into the boxes' tooltips; the legend and the hint
line are gone. What the preset shown changes from the workflow's own is
orange, and its head says how many values that is. A box's values open
under the flow only once one is picked, with x to close.

The set rows' key-value chips went with the column; the tabs count the
differences with ui_param_set_keys.setDifferences. Remaining "方案"
labels in the preset menus now say 预设.

Checked on the isolated test ComfyUI with the two-pass Anima card: each
preset marks the right boxes, the inspector, the + menu and its editor,
all pictures, versions, sticky tabs, and the narrow (docked) layout.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 20:05:38 +08:00
DemonGatanjieuandClaude Opus 5.5 d45fdb9d7c Show a workflow's models, control and finishing in its flow, each box opening its values
The flow now reads the whole graph: the model files and LoRAs (strength, the stages they
feed), control models above the stage they guide, finishing nodes such as ColorMatch after
the samplers. A stage the shown values do not run (a split's empty part, a bypassed sampler)
hangs dashed beside a straight line and no longer counts as changed when only its model
changed. Every box opens its node's values below, changed ones against the workflow's own,
and an unused box names the presets that use it. The in-flow preset row is gone; the left
column already lists them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 19:21:04 +08:00
DemonGatanjieuandClaude Opus 5.5 d4ead01c77 Open a workflow's details with its flow and call its sets presets
A workflow card's details now begin with its flow, in the look of a
stage diagram: one box per sampler in the order they run (base picture,
goes on, enlarge and redraw), each with the main model it is fed
through LoRAs and patches (+ Tile for a Tile LLLite), its steps or the
part of a split it runs ("Not run" when none), the enlargement and the
redraw strength; then the saves. Under it the default and each preset;
the one shown is lit and the stages it changes are marked. The stages
are read from the saved graph alone (recipe_flow.js, pure, with
tests/recipe_flow.mjs); the drawing is ui_recipe_flow.js.

"参数方案" / parameter sets are now 预设 / presets everywhere on screen
(the term table in ui-flows.md lists the old word as retired). "Hand it
to the AI" moves from the bar to the preset's own actions and hands the
preset shown ("workflow / preset"), which run_workflow already applies.

Checked on an isolated ComfyUI with the verified two-pass Anima card:
the default, the "upscale on Realskin" and the "switch mid-way" presets
each mark the right stages and show their models and steps; the hand-off
sentence names the preset. Full suite and structure check pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 18:51:41 +08:00
DemonGatanjieuandClaude Opus 5.5 3d720ef38d Let the AI run a workflow card's parameter sets by name
A workflow card's saved parameter sets (方案) were the user's alone. Now
list_workflows lists each card's sets as "workflow / set" (those unlike
the card's own values, as the Workflows page lists them), and
run_workflow(workflow="workflow / set") opens the workflow and applies
the set with the page's own Apply code before filling in the blanks; the
tab is marked with the set too, so another set opens afresh. No new
argument: the tool list stays within its budget.

The Anima skill points at the sets: the daily run is the user's saved
workflow or one of its sets.

Checked on an isolated ComfyUI: a card built from the verified two-pass
Anima graph with its own values as the plain route and two sets (upscale
on another model, model switch mid-way); run_workflow on the second set
queued exactly its values and made pictures pixel-identical to that
route's verified ones. Full suite and structure check pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-02 17:48:27 +08:00
DemonGatanjieuandClaude Opus 5.5 98c90dd8e4 Move training out of AMB: drop the run record and the training network
AMB only uses: training goes to its own plugin. This takes back the
record of what works (api/ai_evidence.py), the training network and
rounds (api/ai_training.py, ui_ai_network*.js, the round form), the
Gates' record switch, the ways' order by record and the external_skill
field of log_outside that only fed the record.

Kept, as part of using AMB:
- the user's word under a finished run, now only told to the AI
  (ai_run_control.set_verdict, ui_ai_verdict.js);
- the Gates' "Custom nodes: only the ways'" rule;
- a picks block left to the AI takes its recommended picture.

Reverts 73518dc, 67bf5b2, 6647b05 and 49d05cf, then puts those three
back with tests in test_ai_run_watch, test_ai_gates and test_ai_panels.
Full suite and structure check pass.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 21:11:05 +08:00
DemonGatanjieuandClaude Opus 5.5 49d05cfa69 Make the training network a full view over the AI page
The side switch's training network now opens over the whole AI
workbench: numbers on top, a filter by kind, a graph or a table with a
cell per pair, and a detail column listing each run of a pair (model,
AI app, judgement, pictures, task), a base model's models and the
training rounds. New GET /anomalous/ai_training/runs; the network data
adds each model's runs and the rounds.

Not yet verified in the browser: Esc after routing it through the
browser's back buttons. Full test run pending.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 16:11:02 +08:00
DemonGatanjieuandClaude Opus 5.5 6647b059e4 Hide the training network's record from the AI unless the user shows it
The AI goes by the ready-made ways and skills alone by default; the Gates
window's "training network record" shows it the record, and a training
round the user starts always does. add_nodes still picks the way that did
best either way. The network view says whether the AI sees it now.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 15:09:26 +08:00
DemonGatanjieuandClaude Opus 5.5 67bf5b24c9 Add the training network and AI-run training rounds
The AI workbench's side column gets a training network view: base models
on the left, ways, skills and node packs on the right, a line for each
pair that ran, coloured by how it turned out (the user's word first, else
the AI's, dashed) and as thick as it ran often. A node or line shows its
record, last pictures and the pairs not tried yet in a card kept in sight.

"Start a training round" picks a skill (the AI's prompts with its advice
and without) or the ways of one use, up to four models and the pictures
each, and makes a task for the next AI (api/ai_training.py). Each run that
ends fills the trial it fits by what it used; the AI is told the next trial
and, once a model's trials are done, to compare them in a picks panel with
its own pick marked recommended. The record keeps the AI's pick apart from
the user's, and a picks block left to the AI takes its pick.

Tests: tests/test_ai_training.py; full suite and structure check pass.
Checked on an isolated ComfyUI: a round started from the view, four real
runs matched to their trials with the next one told each time, the
comparison panel and the user's pick reached the record and the graph.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 13:02:59 +08:00
DemonGatanjieuandClaude Opus 5.5 73518dcf88 Add a record of what works: ways, skills and packs by model
Each run the AI starts now counts for the ways it still has, the skills
fetched before it and the custom node packs of its nodes, by the base
model of its main model (api/ai_evidence.py). How it went comes from what
the user does anyway: a picture picked in a picks panel or kept in the
gallery, one passed over, or their word under the run (Turned out well /
Not quite, told to the AI as their message).

begin_task and get_toolbox give the AI the record in a few words, add_nodes
a way's or the packs' own, and add_nodes(use=...) picks the use's way that
did best on the canvas's model. The Ways panel shows each way's and skill's
record by model. The Gates window gets "Custom nodes: Any / Only the ways'",
which keeps the AI to the ways' nodes and the task's picks.

Tests: tests/test_ai_evidence.py; full suite and structure check pass.
Checked on an isolated ComfyUI: a real run was recorded with its model and
skill, the verdict reached the AI, and the ways-only rule refused a custom node.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 12:15:04 +08:00
DemonGatanjieuandClaude Opus 5.5 4e5faad768 Give a private task its own skill only, in the Ways panel too
ai_skills.get refuses a private-only skill in a task that is not private and every other
skill in a private one, so a private task's AI gets the privacy skill alone; get_toolbox
tells it by the task. The Ways panel lists the skills of the task's kind and is drawn
again when the task's lock is turned.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 16:15:48 +08:00
DemonGatanjieuandClaude Opus 5.5 eceb51b6a1 Seal a private task's prompts and picture names as tokens, with a prompt box
ai_sealed keeps a private task's prompt text and picture file names behind tokens ([P1],
[img1], task["sealed"]): mcp_server puts the texts back into a call's arguments for the tool
only, and ai_privacy.guard has every result masked on its way out (a node's STRING inputs
by ComfyUI's node list, prompt fields, picture names, any sealed text, also in the text
content). The user's own canvas changes are told sealed. A "prompts" panel block is the
user's prompt box (ui_ai_prompt_box.js): prompts, a negative one and reference pictures from
the gallery or dropped in, answered only from Anomalous, the AI getting tokens; above it the
prompt_pose skill's words for the canvas's model. A new private-only skill, privacy, tells
the AI how to work, and begin_task points a private task at it. Tests plant canary prompts
and picture names in every tool's result and check none gets out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 15:56:37 +08:00
DemonGatanjieuandClaude Opus 5.5 34eba4a901 Add privacy mode: a private task sends the AI none of its pictures
Each task has a lock in its header (task["privacy"]); the Gates window sets the default for
new tasks, and turning the default off pins the tasks it covered. mcp_server hands every
tool result to ai_privacy.guard last, after run pictures and the user's messages were
added, so a private task's image content never leaves; a call tied to no task is private
while the default is on or a private task is unfinished. The card in the AI app shows no
pictures for it, begin_task tells the AI, and turning it on or off is a user step and a
decision. A test calls every tool with a picture in its result and checks none gets out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 15:20:41 +08:00
DemonGatanjieuandClaude Opus 5.5 f65f12152b Fix model kinds misread from headers, checked against real files
Checked against the headers of 315 models in ComfyUI-Manager's list: a Hunyuan-DiT
checkpoint and LBM were read as VAEs, SUPIR as a ControlNet, XLabs' Flux LoRAs and
IP-Adapter as diffusion models, a whole CLIP as a text encoder only; also PhotoMaker, LoRAs
of weight differences or OFT, and checkpoints without a VAE. Files two loaders read from
different folders (SUPIR, a whole CLIP) are not sure. A lone drawing model in checkpoints
loads there (the checkpoint loader reads it as a diffusion model). Newly told: diffusers
UNets, Stable Cascade, SDXL T2I-Adapters, RCAN/SPAN/compact upscalers. 301 of 315 now agree.
"Looks like no drawing model" said what it could not tell: now "Kind not told". Kept header
answers carry the rules version and are read again when it changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 11:15:37 +08:00
DemonGatanjieuandClaude Opus 5.5 c30180cb8d Fix Tidy misjudging Anima LLLite and IP-Adapter files
An Anima LLLite in controlnet is not misplaced while the ComfyUI-Anima-LLLite pack
(which reads it from there) is loaded, and identical copies kept one per loader folder
(controlnet and model_patches) are listed as shared, both in use, not as duplicates to
recycle. An IP-Adapter carrying LoRA layers (the Anima IP-Adapter) is no longer read as a
LoRA. The header cache keeps the new "form" field (older entries are read again).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 00:27:49 +08:00
DemonGatanjieuandClaude Opus 5.5 e956ad8dea Fold the versions of a model behind a tab on its card
A model with other versions downloaded is one card with a numbered tab on its right edge;
a click slides the versions out beside it, under one accent edge, the tab on the last folding
them back. A pin on each picks the version shown when folded. Open models stay open, and
"Open all versions" opens or folds every one. Replaces the version label menu.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 00:06:27 +08:00
DemonGatanjieuandClaude Opus 5.5 36668d2ebf Show on the timeline which skills the AI went by
Each skill the AI fetches with get_toolbox(skill=...) is a "skill" step of its task
(ai_skills.note_use), with the form its advice came in for the canvas's model; the same
advice again before the next run adds nothing. A run's row lists the skills fetched since
the run before it (ai_task_view.skillsBefore). A skill step never names an untitled task.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 05:17:37 +08:00
DemonGatanjieuandClaude Opus 5.5 b261968e79 Show the versions of one model together and switch between them
Files a scan found on the same Civitai model page (metadata model_id; never a similar
file name) share one card in the model list, the newest version shown or the one picked
last (kept in this browser). The card's version label opens the shared action menu to
switch. The details list the versions here under the name, and "All versions on Civitai"
(GET /anomalous/download/versions, this computer only, asked only when pressed) lists
the page's versions to open or download beside this one, checked by SHA-256, a taken
file name getting the version's name added.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 04:44:10 +08:00
DemonGatanjieuandClaude Opus 5.5 b616487d17 Add skills beside the ways: advice an AI fetches for a kind of job
The pose and hands advice for writing prompts moves out of the set_prompt and
run_workflow descriptions into the first skill, prompt_pose (api/skills/). begin_task
lists the skills that are on in a line; get_toolbox(skill=...) gives one; the prompt
arguments only point at it. The tool list is back within its budget (it was 44726 of
44000 characters). The Ways panel lists the skills under the ways, each with a switch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 04:33:48 +08:00
DemonGatanjieuandClaude Opus 5.5 3f36ebee89 Fix AMB not loading: the viewer's size words pulled in a cycle
ui_gallery_viewer.js (8c044d0) imported formatSize from
ui_model_download.js, which leads through the settings page and
browser.js back to ui_ai_workbench.js; with ui_ai_images.js ->
ui_gallery_detail.js -> ui_gallery_viewer.js at the start of that chain,
ui_ai_workbench.js called setMarker before ui_ai_images.js had run, and
the whole plugin failed to load ("Cannot access 'marker' before
initialization"). formatSize now lives in file_size.js, which imports
nothing, and every module takes it from there.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 15:26:36 +08:00
DemonGatanjieuandClaude Opus 5.5 88eaa77472 Make fixing one spot keep its size, and let picks zoom on it
Codex's hand tests (2026-10-29): at denoise 0.55-0.75 the repainted hand
filled its whole mark and came out too big, at 0.4 it kept its size. The
crop-and-stitch block now repaints at 0.45 (the built-in one at 0.5), and
its next step and the inpaint note tell the AI to mark tightly, keep the
strength low, make 4 tries and let the user pick.

Slider and picks blocks take a zoom {x, y, w, h}: every picture shows
only that part, enlarged, from the picture itself. The checks of block
parts move to ai_panel_parts.py (ai_panels.py was at the 600-line line).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 14:39:10 +08:00
DemonGatanjieuandClaude Opus 5.5 ca05da0966 Give Load Image an input copy of an output picture, and tell the AI what the page marks missing
run_workflow's image filled a LoadImage with "name.png [output]"; once
ComfyUI's run history is gone, its newer frontend marks that value as a
missing file though LoadImage reads it (Codex found this on 2026-10-29).
An output picture is now copied into the input folder (content-named,
transparency kept) as the gallery's menu already does.

get_situation's canvas errors also carry what the page's missingMedia
store marks missing, so the AI sees the red error the user sees.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 14:37:09 +08:00
DemonGatanjieuandClaude Opus 5.5 0740e7c5c8 Give each try of a batch its own seed
run_workflow's batch queued the same prompt N times when the sampler's
seed was held "fixed": ComfyUI ran it once and the user had one picture
to pick from. While a batch is queued a fixed seed counts up instead
(the native control moves it per prompt); afterwards the control and the
seed are as they were.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 14:36:47 +08:00
DemonGatanjieuandClaude Opus 5.5 2fdc2f5f30 Warn before a run saves a very large picture
The run estimate followed each sampler's size but not what a SaveImage
finally gets: a 5120x3328 sample upscaled 4x saved 20480x13312 (324 MB)
without a word. A save past 64 megapixels now warns on the timeline and
in the AI's run answer, with the PNG size it will take.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 14:24:31 +08:00
DemonGatanjieuandClaude Opus 5.5 8c044d0d5a Keep very large pictures from freezing the gallery
A 20480x13312 upscale is past Pillow's pixel limit, so its card image
failed and the catch-all fallback served the 324 MB original as the
thumbnail: the gallery and the AI workbench decoded it every time.

- A picture past the limit is shrunk once by a child process
  (huge_picture.py, low priority, one at a time) and cached; a card is
  never a large original, one with no card image gets an SVG with its size.
- /anomalous/output_preview gives the viewers the picture or a cached
  4096 px copy of a very large one; the viewer (moved to
  ui_gallery_viewer.js), the image workbench's stage and the AI pages'
  larger pictures use it, with a note and "Open the original".
- The listing carries each file's size (and big ones' pixel size); such a
  card says "Very large".
- The browser-side PNG metadata read stops at the image data.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 14:23:22 +08:00
DemonGatanjieuandClaude Opus 5.5 cb403867de Ways panel: grouped by use, details folded
The two new uses get their headings (换背景·人物不变, 换模型重画); each block's source, how it was tried and its models sit under Details, so a row reads as its title and a line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 02:16:44 +08:00
DemonGatanjieuandClaude Opus 5.5 6ccb93e385 Ways: refine with another model
refine_other_model redraws the made picture at denoise 0.4 with a second
checkpoint of its own (any family: its own CLIP and VAE, prompts copied from
the first, LoRAs added onto it with add_lora) and saves it beside it
(prefix refined), as the reference workflow's refiner keeps a loader and
LoRA stack apart. Tried on an RTX 4050 6 GB, Illustrious then NoobAI at
832x1216: about 66 s for the whole run, the composition kept, the style the
second model's.

A block node may be "like" a path ("$sampler.positive"): it takes the
settings of the node feeding it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 23:17:51 +08:00
DemonGatanjieu baedf16b6f Merge branch 'feature/1.62' into feature/1.63 (delete character needs TTS interface 19) 2026-10-28 20:59:57 +08:00
DemonGatanjieuandClaude Opus 5.5 5767b4614c Delete character needs Anomalous_TTS interface 19
Interface 18 shipped in Anomalous_TTS v1.1.0 without the route, so the
button now waits for 19 (v1.1.1) instead of failing on a click.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 20:56:27 +08:00
DemonGatanjieu 2f8db12f8e Merge branch 'feature/1.62' into feature/1.63 (delete a character) 2026-10-28 20:42:10 +08:00
DemonGatanjieuandClaude Opus 5.5 9a270d0a42 Delete a character from its card, to the Recycle Bin
Anomalous_TTS issue #2: there was no way to remove a character. Each card
now has an orange Delete character button (also on broken characters);
after a confirm, the node (interface 18, local only) moves the character's
folder to the Recycle Bin.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 20:42:06 +08:00
DemonGatanjieu 65f7b5140d Merge branch 'feature/1.62' into feature/1.63 (audio gallery under Voices) 2026-10-28 20:31:50 +08:00
DemonGatanjieuandClaude Opus 5.5 cae7fd2a4a Audio gallery becomes a view of Voices; the rail fits the number keys
With the AI workbench the rail had ten entries for nine number keys, so
the audio gallery had none. It is now the third tab of Voices (Characters,
Voice-over, Audio); 9 reopens Voices on the view used last, and a test
keeps the rail within nine entries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 20:26:31 +08:00
DemonGatanjieuandClaude Opus 5.5 d610d69a1c Merge branch 'feature/1.62' into feature/1.63 (output pictures in Load Image)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 19:57:22 +08:00
DemonGatanjieuandClaude Opus 5.5 1d444f0669 Let the AI's Load Image take an output picture
new_workflow / add_node checked a LoadImage value against the input folder's files only, so
an AI could not build an img2img on a picture it had just made (and nothing at all with an
empty input folder). Names ComfyUI annotates ('x.png [output]') now pass; ComfyUI checks the
file. CHANGELOG also notes the rail labels fix.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 19:57:21 +08:00
DemonGatanjieuandClaude Opus 5.5 78bfd1d553 Merge branch 'feature/1.62' into feature/1.63 (rail labels)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 19:35:27 +08:00
DemonGatanjieuandClaude Opus 5.5 d3f249fd1a Rail shows 模型 / 图库 again, not the raw keys
ce35145 removed 'models' and 'gallery' as unused, but the rail (labelKey) and the page
titles (TITLE_KEYS) name them by key. A test now checks every such key in both languages.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 19:35:26 +08:00
DemonGatanjieuandClaude Opus 5.5 78502e66c4 Ways: a maintained models list with links and SHA256, and how each was tried
- api/block_models.json: the 15 models the ways recommend, each with its
  Hugging Face / Civitai / GitHub links, size, SHA256 (all checked against the
  sites), licence and folder. A block's "models" names its recommended ones; the
  Ways panel ticks those here (by name, or by size for a renamed copy) and
  downloads a missing one in a click with model_download.downloadFrom, its hash
  checked.
- A block's "tested": the card (RTX 4050 laptop, 6 GB), sizes and a whole run's
  time, shown in the panel and told to the AI with the block (answer.tested).
- color_lineart gets an Anima variant with Anima's lineart LLLite.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 17:14:48 +08:00
DemonGatanjieuandClaude Opus 5.5 dd9c3ee2f5 Tags from a picture, run words to the AI, colour matching after upscales
- tags_from_picture: WD14 tagger (the source's model and thresholds) on a
  picture the user handed; run_status now carries what nodes showed as words
  (texts: a tagger's tags), with a summary and next step for a run that made
  words but no pictures.
- Optional nodes: a block node marked optional goes when its pack is missing,
  and a link "match|decode" takes the first one there. The four upscales end in
  KJNodes' ColorMatch (mkl, the source's) when it is installed; the panel says
  "better with" it otherwise.
- LanPaint's next step keeps the prompt about the whole picture; Follow a pose
  says OpenPose misreads anime (use control_depth), as the source's author did.
- The directory has a size cap: past it, block names alone, so collected ways
  never make begin_task long; shorter headings and few-word lines.

Live-tested on the isolated 8199 ComfyUI: LanPaint (area changed 14.6, outside
0.0, 82 s), tiled 2x (167 s), depth ControlNet (follows the layout), OpenPose
(misreads an anime picture), background removal (8 s), tags (166 s with the
model download), upscale with ColorMatch (73 s).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 03:31:04 +08:00
DemonGatanjieuandClaude Opus 5.5 22a58d3a83 Ways panel: blocks as data files, a switch each, greyed when something is missing
Each block is now api/blocks/<name>.json (nodes, packs, models, the AI's words
and the panel's in both languages), so a way collected later is one more file.
The AI workbench's side column has a Ways view: blocks by job, what each does
and where it came from, greyed with the pack (opens ComfyUI-Manager) or model it
lacks, and a switch (user/anomalous/ai_blocks.json) that keeps it from the AI;
begin_task lists only the blocks on and runnable here, the rest in one line.
New blocks: upscale_iterative (Impact Pack), upscale_two_models ($loader role,
a second loader "like" it), remove_background (inspyrenet-rembg).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 02:40:51 +08:00
DemonGatanjieuandClaude Opus 5.5 5d023f3a7c Blocks: LanPaint repaint, upscale, tiled upscale, pose and depth ControlNets
A block node can be "like" a role (takes its settings) or "replace" it (its
links, place and settings too; LanPaint's sampler for the KSampler). $save is
the output node the picture reaches, past a stitch. Upscale blocks take an
upscale model this ComfyUI has; control blocks a ControlNet whose base fits the
canvas's model, and the picture to follow copied into the input folder. The
directory is grouped by job, a few words a block, to keep begin_task short.
Drop-down choices are read in both forms of ComfyUI's node list.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 02:01:09 +08:00
DemonGatanjieuandClaude Opus 5.5 6ce8af60cd Repaint block: the margin the source used, denoise 0.75, an area prompt
A Flash exam showed the crop-and-stitch repaint painting a whole new
person into the hand: the context margin was 1.2 where the distilled
workflow used 2.0, and the sampler kept denoise 1 and the whole
picture's prompt. A block can now set settings on the canvas nodes it
finds (roles: the sampler's denoise 0.75, in the same Ctrl+Z step),
and the block's answer and the repaint note tell the AI to set the
prompt to what belongs in the area. Retake: a natural hand.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 01:22:21 +08:00
DemonGatanjieuandClaude Opus 5.5 c9870151c1 Ready-made blocks the AI names and Anomalous builds, spliced in
api/reference_blocks.py holds groups distilled from workflows that do
one job well: a repaint that crops around the mark, repaints at 1024
and stitches back (ComfyUI-Inpaint-CropAndStitch), the same with
built-in nodes only, and face and hand detailing (Impact Pack, the
detector models this ComfyUI has). begin_task hands the AI their
directory; add_nodes(block=...) builds one in one call. Its links name
roles web/modules/canvas_roles.js finds on the canvas by their sockets
(the sampler, its decode and save, what feeds an input upstream), so
canvas_wiring splices it into the workflow there; several samplers
need near_node_id, a missing pack names the pack and the stand-in.
The repaint note now points to the block. Checked on the test ComfyUI:
the repaint changed the marked area only, the detailer the face area.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 00:57:50 +08:00