---
name: image_generator
lang: py
domain: ml
version: "1.0.0"
algebraic: product
definition: |
  @runtime_checkable
  class ImageGenerator(Protocol):
      def generate(self, config: GenerationConfig) -> ImageGenResult: ...
description: "Protocol para backends de generacion de imagenes con difusion. Cualquier clase con generate(config) -> ImageGenResult satisface la interfaz sin herencia explicita."
tags: [ml, diffusion, protocol, interface, generator, backend, stable-diffusion, flux]
uses_types: [generation_config_py_ml, image_gen_result_py_ml]
file_path: "python/functions/ml/image_generator.py"
---

## Notas

`algebraic: product` porque un Protocol en Python es un tipo estructural que define un conjunto fijo de metodos — analogia mas cercana a product que a sum. No es un Literal/Union/Enum.

El Protocol usa `@runtime_checkable` para permitir `isinstance(backend, ImageGenerator)` en runtime. La verificacion en runtime solo comprueba la presencia del metodo `generate`, no la firma completa. Para verificacion de tipos estatica estricta, usar mypy o pyright.

**Structural subtyping** — no se necesita herencia:

```python
from image_generator import ImageGenerator
from generation_config import GenerationConfig
from image_gen_result import ImageGenResult

class DiffusersGenerator:
    def generate(self, config: GenerationConfig) -> ImageGenResult:
        # implementacion con diffusers
        ...

# Satisface ImageGenerator sin heredar de el
gen: ImageGenerator = DiffusersGenerator()
assert isinstance(gen, ImageGenerator)  # True
```

**Uso tipico en funciones del registry:**

```python
def batch_generate(
    generator: ImageGenerator,
    configs: list[GenerationConfig],
) -> list[ImageGenResult]:
    return [generator.generate(cfg) for cfg in configs]
```

**Backends planificados:**

| Backend          | Descripcion                                      |
|------------------|--------------------------------------------------|
| DiffusersGenerator | HuggingFace diffusers + torch (GPU/CPU)        |
| SdCppGenerator   | stable-diffusion.cpp via subprocess/ctypes       |
| ComfyUIGenerator | Cliente HTTP a ComfyUI API local                 |
| MockGenerator    | Genera imagen negra para tests sin GPU           |
