> This is a page from the ElevenLabs documentation. For a complete page index, fetch https://elevenlabs.io/docs/llms.txt. For the full documentation in a single file, fetch https://elevenlabs.io/docs/llms-full.txt.

# Ejecuta la plantilla de tu equipo

> **Note**
>
> **Guía práctica** · Da por hecho que has completado el [inicio rápido de plantillas](/docs/es/eleven-api/guides/cookbooks/templates).

Esta guía explica cómo ejecutar una plantilla creada por tu equipo: copiar su código, pasar cada tipo de entrada, elegir qué webhooks reciben el resultado, fijar una versión y leer las salidas.

## Antes de empezar

* La plantilla está compartida con tu espacio de trabajo. Su autor lo configura en **Espacio de trabajo** dentro de las opciones de uso compartido de la plantilla; una plantilla compartida como **Solo yo** solo la puede ejecutar su autor.
* Tu espacio de trabajo tiene un webhook suscrito a las ejecuciones de plantillas. [Antes de empezar](/docs/es/eleven-api/guides/how-to/image-and-video/webhooks#before-you-begin) en la guía de webhooks de Imagen y vídeo explica cómo configurar uno.
* Tu espacio de trabajo tiene un plan Pro o superior, y tu clave de API dispone del permiso **Imagen y vídeo**.

## Copia el código de la plantilla

Abre la plantilla en la app de ElevenLabs y selecciona su pestaña **API**. En Flows, el autor de la plantilla puede abrir el mismo código desde el botón **API** de la barra lateral de la plantilla.

La pestaña genera sus fragmentos a partir de las entradas y salidas publicadas de la plantilla. En **Elige cómo obtener el resultado**, selecciona **Webhook** y, después, **Python** o **TypeScript** encima del código. La pestaña muestra un fragmento de **Iniciar una ejecución** y otro de **Gestionar el resultado**. Copia **Iniciar una ejecución** donde tu aplicación inicia ejecuciones, y **Gestionar el resultado** en tu controlador de webhook. Cada marcador de posición de **Iniciar una ejecución** representa una entrada, y **Gestionar el resultado** lee cada salida por su id.

> **Note**
>
> La pestaña avisa cuando la plantilla utiliza un modelo que la API no ofrece. Si ninguna versión publicada se
> puede ejecutar mediante la API, no muestra fragmentos; si solo no se puede ejecutar la más reciente, los
> fragmentos ejecutan la versión más nueva que sí puede. En Flows, el autor selecciona **Mostrar en el lienzo**
> en el aviso para resaltar esos nodos, cambia cada uno a un [modelo disponible](/docs/es/eleven-api/guides/cookbooks/image-and-video#available-models) y vuelve a publicar.

## Pasa cada entrada

Todas las entradas de la versión que ejecutes deben recibir un valor, usando como clave el id de la entrada. La forma del valor depende del tipo de entrada:

| Tipo de entrada                | Valor                                                                       |
| ------------------------------ | --------------------------------------------------------------------------- |
| `string`                       | El propio texto.                                                            |
| `number`, `integer`, `boolean` | Un valor JSON de ese tipo.                                                  |
| `image`, `video`, `audio`      | Una referencia a un recurso subido, una generación anterior o datos base64. |
| `voice`                        | Una referencia a una voz de tu espacio de trabajo.                          |
| `array`                        | Una lista con un valor por elemento, cada uno en el formato de su tipo.     |

Las entradas de tipo `object` todavía no se pueden pasar mediante la API; la pestaña API avisa sobre ellas.

```python
run = client.flows.templates.runs.create(
    template_id="Yz4DETxRv4uXyIo5PnEy",
    version_id="Kqs4nRrpndEjQ54BhbwE",
    inputs={
        "headline": "Autumn collection, 20% off",
        "duration_secs": 8,
        "product_photo": TemplateInputReference_Asset(asset_id="Rk3pQm8vTzL1yWcN0bJd"),
        "previous_shot": TemplateInputReference_Generation(generation_id="JWr5N6X9ZTqf8jD2LmQb"),
        "phone_photo": TemplateInputReference_InlineBase64(
            content_base_64=photo,
            mime_type="image/jpeg",
        ),
        "narrator": TemplateInputReference_Voice(voice_id="JBFqnCBsd6RMkjVDRZzb"),
    },
    webhook=WebhookTarget_All(),
)
```

```typescript
const run = await client.flows.templates.runs.create("Yz4DETxRv4uXyIo5PnEy", {
  versionId: "Kqs4nRrpndEjQ54BhbwE",
  inputs: {
    headline: "Autumn collection, 20% off",
    duration_secs: 8,
    product_photo: { type: "asset", assetId: "Rk3pQm8vTzL1yWcN0bJd" },
    previous_shot: { type: "generation", generationId: "JWr5N6X9ZTqf8jD2LmQb" },
    phone_photo: {
      type: "inline_base64",
      contentBase64: photo.toString("base64"),
      mimeType: "image/jpeg",
    },
    narrator: { type: "voice", voiceId: "JBFqnCBsd6RMkjVDRZzb" },
  },
  webhook: { type: "all" },
});
```

Los id de entrada mantienen la misma grafía que les da la plantilla en ambos SDK; solo los campos de una referencia, como `assetId`, usan camelCase en TypeScript.

Los datos base64 están limitados a 25 MB una vez decodificados y no se conservan después de la ejecución. Para pasar el mismo archivo a muchas ejecuciones, súbelo una vez y pasa su ID de recurso, como se describe en [Referencias y recursos](/docs/es/eleven-api/guides/how-to/image-and-video/references).

## Obtén el resultado

Un [webhook](/docs/es/eleven-api/resources/webhooks) recibe la ejecución terminada como un evento `flows_template_run`. Los fragmentos de **Webhook** de la pestaña API pasan `{"type": "all"}`, que envía la ejecución terminada a todos los webhooks del espacio de trabajo suscritos a ejecuciones de plantillas. Para enviarla a webhooks específicos, indica sus ID:

```python
webhook=WebhookTarget_Ids(ids=["Q8mVr2LpXcT4nB6yJdKw"])
```

```typescript
webhook: { type: "ids", ids: ["Q8mVr2LpXcT4nB6yJdKw"] }
```

Cada webhook indicado debe estar suscrito a ejecuciones de plantillas. Se rechaza una ejecución que solicita un webhook cuando no hay ninguno suscrito, por lo que una ejecución nunca termina sin un destino al que entregar su resultado.

Para un script puntual o un trabajo por lotes, `create_and_wait`, usado en el [inicio rápido de plantillas](/docs/es/eleven-api/guides/cookbooks/templates), espera a que termine la ejecución en su lugar.

## Fija una versión

Los fragmentos pasan el `version_id` de la versión publicada más reciente que puede ejecutar la API. Mantenlo fijado: cuando el autor vuelva a publicar, una ejecución fijada seguirá ejecutando la versión que probaste, mientras que `latest` cambia a la nueva, que puede cambiar el nombre de las entradas o añadir otras.

Para pasar a una versión nueva, abre otra vez la pestaña API, compara sus entradas con las que pasa tu código y actualiza `version_id`. Para comprobarlo desde código, `flows.templates.get` devuelve las versiones publicadas de la plantilla que puede ejecutar la API, de más reciente a más antigua, cada una con sus entradas y salidas.

## Lee las salidas

Las `outputs` de la ejecución terminada tienen una entrada por cada salida de la plantilla, usando como clave el id de la salida. Cada salida tiene su propio `status`, por lo que una salida puede fallar mientras las demás se completan. Una salida fallida incluye `failure_reason` y `error_message`. Una salida multimedia completada incluye `content_url` y `content_mime_type`, y una salida `string` completada incluye `content`.

```python
run = TemplateRunResponse.model_validate(event["data"])

for output_id, output in run.outputs.items():
    if output.status == "failed":
        print(output_id, "failed:", output.failure_reason, output.error_message)
    elif output.type == "image" or output.type == "video" or output.type == "audio":
        print(output_id, output.content_url, output.content_mime_type)
    elif output.type == "string":
        print(output_id, output.content)
```

```typescript
const run = event.data;

for (const [outputId, output] of Object.entries(run.outputs)) {
  if (output.status === "failed") {
    console.error(outputId, "failed:", output.failure_reason, output.error_message);
  } else if (output.type === "image" || output.type === "video" || output.type === "audio") {
    console.log(outputId, output.content_url, output.content_mime_type);
  } else if (output.type === "string") {
    console.log(outputId, output.content);
  }
}
```

`constructEvent` en el SDK de TypeScript devuelve el JSON del evento tal como se envió, por lo que sus campos están en snake_case.

Consulta [Comportamiento de entrega](/docs/es/eleven-api/guides/how-to/image-and-video/webhooks#delivery-behavior) para obtener información sobre reintentos y eventos duplicados.