16 Commits
Author SHA1 Message Date
jeremie louvaertandClaude Opus 5 fdf6ce1a5d Add README cover image
Archival cover in the house style: an accounting hall of adding
machines, our clerk's tape by far the longest and spilling across the
floor, hands off the keys while everyone else works on. A circuit
breaker for your wallet.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-16 18:55:53 +02:00
jeremie louvaertandClaude Fable 5 b778c3581a Clean up README wording
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-15 10:54:26 +02:00
jeremie louvaert 819843c4ee Add prompt_studio_styled_generation demo workflow
Wires Prompt Studio Settings (new in Gemini-Direct v1.2.0) → Prompt Studio
+ Hash Vault any_input_2 → Hash Vault Check Cache, with the
brief STRING driving both Prompt Studio.brief and Hash Vault.payload_string.
Cache key = (brief + style), so changing either invalidates correctly.
Label Builder auto-formats the sidecar label as 'brief / style'.

Lazy API Switch bypasses the entire Prompt Studio + Gemini + Save chain on
cache hit. Demonstrates the canonical from-scratch generation pattern with
full caching.
2026-04-26 09:52:44 +02:00
jeremie louvaert 997da34a3c v1.4.2: Hash Vault Label Builder node
New node: HashVaultLabelBuilder (🏷️ Hash Vault Label Builder).
Concatenates up to 4 any-type inputs with a configurable separator into
one STRING for Hash Vault Save's label input. Wire once per workflow
(e.g. style + variant + intensity from Gemini Style Transfer Settings)
and never type a label manually again.

Empty strings, None, and whitespace-only inputs are skipped so partial
wiring produces clean output. Non-string inputs are stringified at join
time.

Solves the repeated-typing pain exposed by running the 77-entry
photographer QA pass. Labels follow the canonical
"Photographer / Variant / intensity" convention automatically.
v1.4.2
2026-04-24 09:30:29 +02:00
jeremie louvaert 4048b9a8e0 v1.4.1: Hash Vault Browser — keybinding + sidebar tab
Three ways to open the browser now:
- Ctrl+Shift+H keybinding from anywhere in ComfyUI
- Left-sidebar "Hash Vault" tab with entry count + Open Browser button
- Top menu (Extensions → AKURATE: Hash Vault Browser) — unchanged from v1.4.0

Sidebar registration guarded on app.extensionManager.registerSidebarTab so
older frontends fall back cleanly to menu + keybinding only.

No backend changes — pure JS polish.
v1.4.1
2026-04-24 09:08:19 +02:00
jeremie louvaert 04e31f5b77 v1.4.0: Hash Vault Browser modal gallery
New feature: modal gallery UI over the vault, accessible from the top menu
bar under Extensions → AKURATE: Hash Vault Browser. Reads all sidecar
metadata + thumbnails shipped in v1.3.0 and presents them as a filterable
grid. No graph node required.

Backend: new GET /akurate/hash_vault/list route walks output/hash_vault/,
reads every {hash}.json sidecar, returns JSON sorted by last_accessed_at
desc with pt_size enrichment. Thumbnails reuse ComfyUI's built-in /view
route (type=output&subfolder=hash_vault) — zero new thumbnail endpoint.

Frontend: single web/hash_vault_browser.js (vanilla JS, no framework).
Modal with CSS grid, live substring filter on label+hash, click-to-copy
hash with toast, lazy-loaded thumbnails, relative-age display, ESC and
backdrop-click dismiss.

__init__.py now declares WEB_DIRECTORY and imports the route module.

Deferred to v1.5+: load-into-workflow action, delete, bulk ops, sort
controls, pagination. Current vault (57 entries, 2.33 GB .pt, 3.7 MB
thumbs) loads instantly so none of those are urgent.
v1.4.0
2026-04-24 08:56:06 +02:00
jeremie louvaertandClaude Opus 4.7 84e074766d v1.3.0: sidecar metadata + thumbnail + orphan migration
HashVaultSave now writes {hash_key}.json (label, timestamps, payload summary) and {hash_key}.thumb.png (256px preview) alongside the .pt, inside the existing FileLock. New optional label input on Save node, does not factor into the hash. DeterministicHashVault bumps last_accessed_at on cache hit (silent no-op for pre-v1.3.0 entries). folder_paths import is tolerant of being outside ComfyUI so the sidecar helpers are reusable from tooling.

tools/migrate_hash_vault.py backfills sidecars for pre-v1.3.0 entries, using file mtime as created_at and "(legacy)" as label.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v1.3.0
2026-04-23 11:25:19 +02:00
jeremie louvaert eda9826431 v1.2.2: image-only sample uses Gemini Style Transfer Settings node
Replaces the two StringConstantMultiline nodes in hash_vault_image_only.json
with the new GeminiStyleTransferSettings node from Gemini-Direct v1.1.0.
The Settings node keeps the real ComfyUI dropdown UX (typeahead, validation)
while still fanning style + intensity into both the Style Transfer input
and the Hash Vault any_input slot. Avoids the typo-silent cache-break mode
of free-text StringConstantMultiline.

README's image-only section rewritten to explain the UX rationale.
v1.2.2
2026-04-19 08:43:04 +02:00
jeremie louvaertandClaude Opus 4.7 cdca9251ec Add image-only Hash Vault sample workflow, v1.2.1
workflows/hash_vault_image_only.json demonstrates the v1.2.0 image+
widgets pattern: Gemini Style Transfer (image, style, intensity, no
prompt). The style and intensity widgets are converted to inputs and
driven by two StringConstantMultiline nodes that ALSO feed Hash
Vault's any_input_2 / any_input_3. The image fans out to both Style
Transfer and Hash Vault's any_input.

README split into two examples (prompt-driven vs image-only) so new
users can pick the pattern that matches their API node.

Patch bump to retrigger the Comfy Registry publish so installed
copies pick up the new workflow file.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v1.2.1
2026-04-19 08:24:05 +02:00
jeremie louvaertandClaude Opus 4.7 06265fd439 Hash Vault: optional payload_string + three extra any-type slots, v1.2.0
Dropped the forceInput=True on payload_string so the socket is truly
optional. Added any_input_2, any_input_3, any_input_4 alongside the
existing any_input. Users can now hash purely on image + converted-
widget values without manufacturing a synthetic payload string.

Primary use case: image-only APIs with meaningful widgets. For a
Gemini Style Transfer node with (image, style dropdown, strength
float) and no prompt, convert the style and strength widgets to
inputs, then wire image -> any_input, style -> any_input_2,
strength -> any_input_3. All three factor into the hash.

Back-compat: workflows that only use payload_string + any_input
produce bit-identical hash keys to v1.0/v1.1. The "__slotN:" prefix
only appears when slots 2-4 are actually wired, so existing
hash_vault/ entries keep hitting. Verified with a direct comparison
against the pre-v1.2 hashing path.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v1.2.0
2026-04-18 21:01:19 +02:00
jeremie louvaertandClaude Opus 4.7 6d399c8f52 Add Hash Vault sample workflow, v1.1.0
workflows/hash_vault_basic.json wires the canonical cache-skip pattern:
one StringConstantMultiline feeds both DeterministicHashVault (for hashing)
and GeminiImageGenerate (for the actual API call). On cache hit the Lazy
API Switch short-circuits the Gemini branch entirely — no API call, no
charge. On miss, Gemini runs, HashVaultSave writes the result to disk,
and the next run with the same prompt is a hit.

README updated with a walkthrough and the pack dependencies
(ComfyUI-API-Optimizer, ComfyUI-Gemini-Direct, ComfyUI-KJNodes for the
StringConstantMultiline primitive — any STRING-output node works in
its place).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
v1.1.0
2026-04-18 20:42:57 +02:00
jeremie louvaert 24aca3e57f Add Comfy Registry publish workflow v1.0.0 2026-03-23 23:35:47 +01:00
jeremie louvaert cce44942b3 Set PublisherId to akurate 2026-03-23 23:32:59 +01:00
jeremie louvaert e0b25ccd48 Add pyproject.toml for Comfy Registry publishing 2026-03-23 23:17:29 +01:00
jeremie louvaertandClaude Opus 4.6 3c8ea5fd20 Update README with actual repository URL
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 14:51:54 +01:00
jeremie louvaertandClaude Opus 4.6 9736f62bd2 Initial release: production-hardened API optimization nodes for ComfyUI
Four custom nodes for cost tracking, deterministic caching, and lazy
execution bypass when using external APIs (Kling, Magnific, RunPod, etc.).

Key production features:
- Full-content tensor hashing (no lossy approximations)
- Decimal arithmetic for financial precision
- File locking for concurrent access safety
- Atomic writes to prevent corruption
- Cache TTL support
- Transaction audit logging
- Device-portable tensor serialization

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-20 14:51:27 +01:00