Epic: AI actions — provider-agnostic capabilities on the first-class action pipeline
Rewritten from the old "Flux image-actions UI scaffold" plan. That plan was 90% UI and assumed ModelsLab/Flux specifics. The real work is architectural: make AI editing a first-class, provider-agnostic part of the existing action system.
Vision
tiles already edits images and videos and composes them into tiles. The goal is to add AI-powered editing workflows as ordinary actions — provider-agnostically. ModelsLab/Flux is just the first implementation; the same actions must adapt to Replicate, Fal, etc.
Principles (decided)
- Actions are generic capabilities (verbs); providers/models are configuration.
image-edit, image-upscale, image-animate — never flux-*.
- First-class lifecycle. AI runs as
tiles-cli subcommands emitting TILES_PROGRESS → progress, batch, output-modes, Outputs page for free. (Flux's mistake: a Tauri reqwest command on a parallel path.)
- One active provider at a time, chosen in Settings. Actions gate on media type AND active-provider capability support — reusing existing media-type gating.
- Design for many, implement one. Build the capability/provider abstraction + per-provider credential map now; only declare/implement ModelsLab.
- Descriptor is the single source of truth. Provider/capability/model descriptors live in Rust, exposed via a Tauri command (like
list_actions). Settings, gating, forms, and payload preview all render from it.
- Hybrid forms. Generic core hand-coded; provider-specific advanced + payload preview descriptor-driven.
- Full media matrix eventually: image→image, image→video (on-brand), text→image, video→video, text→video — incrementally.
Sequencing — scaffold first, no API keys required
No accounts yet, so the only deferred piece is the live HTTP call. Everything else is built against a dry-run backend that validates inputs and emits the exact payload it would send. The app becomes fully clickable end-to-end before any key exists; the day a key arrives, only one inner function changes.
#5 (A) contract + dry-run backend → #6 (B) registry + gating + kill parallel path
↘ #8 (D) hybrid forms + payload preview (alongside B)
→ #7 (C) matrix capabilities, incrementally
→ [deferred] live API call once a key exists
Taxonomy
Capability (generic, user-facing) → Provider (active, in Settings) → Model
image-edit / image-upscale ModelsLab / Replicate / Fal Flux / SDXL / …
image-animate (image→video) Replicate / Fal / … Kling / SVD / …
Sub-issues
Status of existing code
The current flux-img2img (image_actions.rs + flux-img2img-form.tsx + single modelslab_api_key) is an unverified spike on the wrong path. Superseded: rewritten onto the CLI/dry-run path in A/B; single key → credential map. See #3 (closed) for history.
Out of scope
Frontend test coverage is tracked separately in #2 (Vitest), unaffected by this epic.
Epic: AI actions — provider-agnostic capabilities on the first-class action pipeline
Vision
tiles already edits images and videos and composes them into tiles. The goal is to add AI-powered editing workflows as ordinary actions — provider-agnostically. ModelsLab/Flux is just the first implementation; the same actions must adapt to Replicate, Fal, etc.
Principles (decided)
image-edit,image-upscale,image-animate— neverflux-*.tiles-clisubcommands emittingTILES_PROGRESS→ progress, batch, output-modes, Outputs page for free. (Flux's mistake: a Taurireqwestcommand on a parallel path.)list_actions). Settings, gating, forms, and payload preview all render from it.Sequencing — scaffold first, no API keys required
No accounts yet, so the only deferred piece is the live HTTP call. Everything else is built against a dry-run backend that validates inputs and emits the exact payload it would send. The app becomes fully clickable end-to-end before any key exists; the day a key arrives, only one inner function changes.
Taxonomy
Sub-issues
Status of existing code
The current
flux-img2img(image_actions.rs+flux-img2img-form.tsx+ singlemodelslab_api_key) is an unverified spike on the wrong path. Superseded: rewritten onto the CLI/dry-run path in A/B; single key → credential map. See #3 (closed) for history.Out of scope
Frontend test coverage is tracked separately in #2 (Vitest), unaffected by this epic.