---
name: generation_config
lang: py
domain: ml
version: "1.0.0"
algebraic: product
definition: |
  class GenerationConfig(BaseModel):
      prompt: str
      negative_prompt: str | None = None
      seed: int
      steps: int
      cfg_scale: float
      sampler: SamplerName
      width: int
      height: int
      model: ModelRef
      loras: list[LoraRef] = []
      clip_skip: int | None = None
description: "Contrato de parametros para generacion de imagenes con modelos de difusion. Tipo central del dominio ml. Serializable a JSON canonico para intercambio con Go."
tags: [ml, diffusion, generation, config, stable-diffusion, flux, prompt, seed, sampler]
uses_types: [model_ref_py_ml, lora_ref_py_ml, sampler_name_py_ml]
file_path: "python/functions/ml/generation_config.py"
---

## Ejemplo

```python
from model_ref import ModelRef
from lora_ref import LoraRef
from generation_config import GenerationConfig

cfg = GenerationConfig(
    prompt="a futuristic city at night, neon lights, photorealistic",
    negative_prompt="blurry, low quality, watermark",
    seed=42,
    steps=30,
    cfg_scale=7.5,
    sampler="euler_a",
    width=1024,
    height=1024,
    model=ModelRef(
        name="stabilityai/stable-diffusion-xl-base-1.0",
        model_type="sdxl",
    ),
    loras=[LoraRef(path="loras/detail_tweaker.safetensors", weight=0.8)],
)

# Serializar a JSON canonico (para Go u otro servicio)
json_bytes = cfg.model_dump_json()

# Deserializar desde JSON
cfg2 = GenerationConfig.model_validate_json(json_bytes)
assert cfg == cfg2
```

## Notas

Tipo producto inmutable (`frozen=True`). Fallback a `dataclass(frozen=True)` si pydantic no esta instalado (sin validacion de literales en runtime).

Restricciones de dimensiones por arquitectura:

| model_type    | width/height recomendado | multiplo |
|---------------|--------------------------|----------|
| sd15, sd20    | 512 x 512                | 64       |
| sdxl, sd3     | 1024 x 1024              | 64       |
| flux_*        | 1024 x 1024 (libre)      | 16       |

`seed=-1` indica semilla aleatoria — el backend genera una y la incluye en `ImageGenResult.meta["seed_used"]`.

`loras=[]` es el default correcto (lista vacia). En el fallback dataclass se usa `tuple` para mantener la inmutabilidad (dataclass frozen + list = error).
