Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
5.3 KiB
id, title, status, type, domain, scope, priority, depends, blocks, related, created, updated, tags
| id | title | status | type | domain | scope | priority | depends | blocks | related | created | updated | tags | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0084 | imagegen_studio — app Go binario producto (Fase 3 plan stack) | pendiente | feature |
|
app-scoped | media | 2026-05-13 | 2026-05-17 |
Objetivo
App Go autocontenida imagegen_studio que orquesta sd-cli para generar imagenes
sin Python en runtime. Encarna la Fase 3 del documento del stack: binario
distribuible, GenerationConfig Go nativo, subprocess streaming con progreso.
Contexto
- Toda la capa Go del contrato esta lista: tipos
GenerationConfig_go_ml,ModelRef_go_ml,LoraRef_go_ml,ImageGenResult_go_ml, interfaceImageGenerator_go_ml. - Funciones Go ya construidas:
sdcli_resolve_binary_go_ml,sdcli_generate_go_ml,subprocess_stream_go_core,genconfig_to_sdcli_args_go_ml,genconfig_json_marshal_go_ml,sdcli_parse_progress_go_ml,get_gpu_info_go_infra. - Plan del documento: producto Go con subprocess gestionando
sd-cli, binario embebido viago:embedo descarga al primer arranque.
Arquitectura
Path: projects/imagegen/apps/imagegen_studio/
imagegen_studio/
main.go # CLI args / TUI entry / HTTP API
studio.go # ImageGenerator wrapper sobre sdcli_generate
app.md # frontmatter del registry
CMakeLists.txt # NO (es Go, usa go.mod)
go.mod
README.md
embed/ # opcional: sd binary embebido
Pure core / impure shell:
pkg/: validacionGenerationConfig, serializacion JSON, formato outputs (paths derivados).shell/ostudio.go: invocacionSdcliGenerate, IO disco, manejo subproceso.
Tres modos de uso:
- CLI:
imagegen_studio generate --prompt "..." --seed 42 --out out.png - HTTP API:
imagegen_studio serve --port 8088→ POST /generate {GenerationConfig JSON} - TUI (opcional, Bubble Tea): forma interactiva, preview, queue
Empezar por CLI; HTTP API y TUI iterativos.
Tareas
-
Scaffolding 1.1.
fn run init_go_app --project imagegen imagegen_studio(si existe pipeline) o crear estructura manual. 1.2.app.mdconframework: cli,tags: [ml, imagegen, service?],uses_functions:lista de las 7 funciones Go citadas. 1.3.go.modcon dependencias minimas (registry imports + cobra opcional). -
CLI minima (Fase A) 2.1. Subcomando
generate: flags --prompt/--negative/--seed/--steps/--cfg/--sampler/ --width/--height/--model/--out 2.2. ConstruirGenerationConfig, llamarSdcliResolveBinary(""),SdcliGenerate(...). 2.3. Stream progreso a stderr (callbackSdcliProgressCallback). 2.4. Salida final: imprime path de la imagen + duration_ms + JSON meta. -
JSON I/O (Fase B) 3.1. Subcomando
generate-from-json --config path/cfg.json --out out.png. 3.2. Permite pegar configs validados de la fase 2 (notebook cross-validation). -
HTTP server (Fase C, feature flag) 4.1.
imagegen_studio serve --port 8088. 4.2. POST/generatebody = GenerationConfig JSON → respuesta multipart PNG + meta. 4.3. GET/health→ 200 + version + GpuInfo. 4.4. Feature flagimagegen-studio-serverpara esconder cuando no compila/no testeado. -
e2e_checks 5.1. Anadir bloque
e2e_checksenapp.md: -build: go build con CGO_ENABLED=0 -cli_help: ./imagegen_studio --help, contiene "generate" -smoke: sisdbinario en $PATH + SD Turbo en vault, generar 1 imagen a /tmp/, verificar PNG valido. Si no: SKIP (warning). -
Tests 6.1. Tests unitarios sobre helpers puros (path derivation, JSON marshaling). 6.2. Test integracion en e2e_checks (smoke).
Ejemplo de uso
# CLI directo
imagegen_studio generate \
--model /home/lucas/vaults/imagegen_models/diffusers/sd-turbo/sd_turbo.safetensors \
--prompt "a red apple on a wooden table" \
--seed 42 --steps 1 --cfg-scale 0.0 --sampler euler_a \
--width 512 --height 512 \
--out /tmp/apple.png
# Desde config JSON validado en spike notebook 02
imagegen_studio generate-from-json \
--config ~/vaults/imagegen_models/configs/spike01_seed42_*.json \
--out /tmp/seed42.png
# HTTP API (feature flag activado)
imagegen_studio serve --port 8088 &
curl -X POST -H "Content-Type: application/json" \
-d @config.json http://localhost:8088/generate -o out.png
Decisiones
- Subprocess via SdcliGenerate — no cgo ni bindings. Mas robusto, mas lento al arrancar (~200ms cold start), pero overhead irrelevante frente a 1-30s generacion.
- NO
go:embeddel binariosden Fase A — el binario depende de la GPU del usuario (CUDA/CPU/Vulkan). Documentar requisito: tenersden $PATH (issue 0082). - Feature flag para HTTP API — Fase A es CLI, no romper master con server a medias.
Prerequisitos
- Issue 0082 (binario
sdcompilado en $PATH) — sin esto el smoke falla pero la app compila. Se puede arrancar el scaffolding antes. - Funciones Go de Ola 3.C (hechas).
Riesgos
sd-clino soporta SD Turbo cleanly con 1-step euler_a → puede requerir 4-step como minimo. Validar en issue 0082.- Distribucion sin binario
sdempotrado obliga al usuario a instalarlo. Aceptable para Fase A; reevaluargo:embedcon build-per-backend en Fase C+. - Si Fase 0 (spike) del documento revela calidad insuficiente: replantear stack y pausar este issue.