Grupo de recursos
Reúne las referencias de un personaje. Guarda su identificador como GroupId.
De tus referencias a una escena: crea grupos, prepara personajes y genera vídeo.
Guía de CloudCLI incorporada y revisada en español, con ejemplos propios y comparación técnica.
Fuentes consultadas el 27 de septiembre de 2026.
Coinciden en el flujo de trabajo y en las diez operaciones de la biblioteca. La revisión distingue diferencias de presentación, aclaraciones del servicio y ajustes de los ejemplos.
| Aspecto | Guía de CloudCLI | Resultado de la revisión |
|---|---|---|
| Idioma y repetición | Hay bloques en inglés intercalados y repetidos. | Se conserva una única explicación en español por tema. |
| Capacidad de la biblioteca | Pide activar derechos avanzados; no explica la cuota compartida. | BytePlus indica que la capacidad se comparte con retratos reales. |
| Foto del rostro | Recomienda iluminación clara y ausencia de oclusiones. | BytePlus concreta: rostro frontal neutro, hombros visibles y cara ocupando aproximadamente dos tercios. |
| Procesamiento y paginación | Ya incluye estados, NextToken y LastInferenceTime. | Coinciden. Se reorganizan; no se presentan como funciones ausentes. |
| Modelo de los ejemplos | Los ejemplos fijan Seedance 2.0. | BytePlus también utiliza 2.0 en ejemplos. Aquí el modelo se configura, sin atribuir esos identificadores a 2.5. |
| Código cURL | El bloque separa comandos y pierde comillas necesarias. | Se ofrece un ejemplo nuevo con cabeceras entre comillas y cuerpo JSON en un archivo. |
| Imágenes de referencia | Una captura de IAM queda mezclada con cinco referencias creativas. | La captura pasa a Permisos. Las cinco referencias conservan su propio orden. |
| Permisos | La política propuesta usa ark:*Asset* sobre todos los recursos. | Incluye operaciones de eliminación. Se explica su alcance antes de mostrar el ejemplo. |
| Tipos de datos | Usa AIGC y los tipos de archivo en apartados distintos. | Se distinguen GroupType (clase de grupo) y AssetType (Image, Video o Audio). |
La comparación se refiere a las páginas enlazadas, consultadas en la misma fecha. Los bloques de código de esta versión son ejemplos propios.
Guarda referencias privadas para reutilizar personajes en Seedance 2.0 y 2.5. Cada archivo tiene un identificador y pertenece a un grupo.
El acceso completo requiere los derechos de creación avanzada. La capacidad se comparte con la biblioteca de retratos reales. Los personajes virtuales deben ser propios, respetar derechos de terceros y no reproducir la identidad de personas reales.
Biblioteca privada de retratos virtuales · documento original ↗

El gráfico conserva los nombres de la interfaz original. Los pasos están explicados en español en esta página.
Reúne las referencias de un personaje. Guarda su identificador como GroupId.
Es un archivo concreto. Su Id identifica la imagen, el vídeo o el audio.
«Imagen 1» describe su posición en la solicitud, no el nombre guardado en la biblioteca.
GroupType: AIGC corresponde al grupo de personajes virtuales. No equivale a AssetType, que indica el formato de recurso.
Ejemplo de organización: el grupo «Luna» contiene «rostro frontal», «vestuario azul» y «voz tranquila». Cada archivo conserva un identificador diferente.


Utiliza versiones coherentes del mismo personaje. Nombra cada archivo por su función para distinguir fácilmente apariencia, vestuario y voz.
En Model Playground, abre Mis recursos → Retrato virtual → Gestionar recursos. Crea un grupo y sube sus archivos. La plataforma los revisa antes de permitir su uso.
Una organización útil: un grupo por personaje y nombres que distingan la vista, el vestuario y la versión. Por ejemplo, «Luna / frontal / chaqueta azul / v2».

En la interfaz original, estas opciones aparecen como My assets, Virtual Portrait y Manage assets.
| Recurso | Formato | Límites por archivo |
|---|---|---|
| Imagen | JPEG, PNG, WebP, TIFF, GIF, HEIC/HEIF | Menos de 30 MB; 300 < ancho y alto < 6000 px; 0,4 < ancho/alto < 2,5. |
| Vídeo | MP4, MOV | 2–30 s; hasta 200 MB; 24–60 fps; 480p–4K. Ancho y alto: 300–6000 px; proporción: 0,4–2,5; píxeles totales: 407.696–8.295.044. |
| Audio | WAV, MP3 | 2–30 s; hasta 15 MB. |
La API recibe una URL accesible, no Base64. Comprueba también los límites de entrada del modelo elegido.
| Operación · POST | Uso |
|---|---|
| CreateAssetGroup | Crear grupo |
| CreateAsset | Subir un recurso |
| ListAssetGroups | Buscar grupos |
| ListAssets | Buscar recursos |
| GetAsset | Consultar un recurso |
| GetAssetGroup | Consultar un grupo |
| UpdateAssetGroup | Cambiar nombre o descripción del grupo |
| UpdateAsset | Cambiar nombre del recurso |
| DeleteAsset | Eliminar un recurso |
| DeleteAssetGroup | Eliminar un grupo y su contenido |
CreateAssetGroup utiliza autenticación AK/SK. Antes del primer grupo, BytePlus pide completar la autorización en su consola. Name admite 64 caracteres y Description, 300. Para personajes virtuales, usa GroupType: AIGC.
Indica ProjectName en todas las operaciones si no utilizas el proyecto default. Conserva el Id devuelto: identifica al grupo.
{
"Name": "Luna — temporada 1",
"Description": "Referencias del personaje virtual Luna",
"GroupType": "AIGC",
"ProjectName": "default"
}Crear un grupo · CreateAssetGroup ↗
En CreateAsset, envía GroupId, URL y AssetType: Image, Video o Audio. El nombre sirve para localizar el archivo; no describe al personaje al modelo. La carga es asíncrona y puede tardar, especialmente con vídeo.
{
"GroupId": "REEMPLAZA_POR_EL_ID_DEL_GRUPO",
"URL": "https://tu-dominio.example/luna-frontal.png",
"Name": "Luna frontal v2",
"AssetType": "Image",
"ProjectName": "default"
}Son cuerpos de solicitud, no peticiones listas para ejecutar. Sustituye los valores de ejemplo y envíalos con el SDK de BytePlus, que firma las llamadas AK/SK. Mantén las credenciales en tu servidor.
Moderation.Strategy admite Default y Skip. El segundo omite parte del prefiltrado, no todas las comprobaciones. Los ejemplos de esta guía conservan la revisión predeterminada.
Consulta GetAsset con el Id del recurso y su ProjectName. La respuesta distingue tres estados:
En procesamiento. Espera y vuelve a consultar.
Listo para usar como referencia.
Ha fallado. Revisa Error.Code y Error.Message.
La URL de acceso que devuelve esta consulta caduca a las 12 horas. LastInferenceTime indica la última solicitud de generación que utilizó el recurso; su actualización puede tardar 1–2 minutos. Que el campo no aparezca no demuestra que nunca se haya usado: solo recoge invocaciones posteriores al 24 de julio de 2026.
# Pseudocódigo: adapta consultar_recurso a tu SDK.
limite = ahora() + 600
while ahora() < limite:
recurso = consultar_recurso(id_recurso, proyecto)
if recurso["Status"] == "Active":
return id_recurso
if recurso["Status"] == "Failed":
raise Error(recurso.get("Error"))
esperar(5)
raise Error("El recurso sigue procesándose; consulta de nuevo más tarde")Introduce asset://ID_DEL_RECURSO en el campo de URL de la referencia. En el texto del prompt, identifica los recursos por tipo y posición: «Imagen 1», «Vídeo 1» o «Audio 1». La numeración se cuenta por separado dentro de cada tipo. No escribas el Asset ID como nombre del personaje.
La generación utiliza la clave de la API de ModelArk. Los recursos se envían en content, junto con sus roles, y la creación devuelve una tarea que debes consultar hasta que termine.
{
"model": "REEMPLAZA_POR_TU_MODELO_O_ENDPOINT",
"content": [
{"type": "text", "text": "El personaje de la Imagen 1 saluda a cámara y dice: Hola, soy Luna."},
{
"type": "image_url",
"image_url": {"url": "asset://REEMPLAZA_POR_EL_ID_ACTIVO"},
"role": "reference_image"
}
],
"generate_audio": true,
"duration": 5,
"ratio": "16:9",
"watermark": true
}Sustituye ambos identificadores y usa un endpoint del mismo proyecto que el recurso. El ejemplo es una plantilla editable; esta web no ejecuta generaciones ni solicita claves.
Uso de referencias de personajes en la generación ↗
import os
import time
from arkruntime import Ark
# Instala el SDK con: pip install arkruntime
# Define ARK_API_KEY, ARK_MODEL_ID y ARK_ASSET_ID en tu entorno.
# ARK_ASSET_ID debe contener el ID de un recurso en estado Active.
cliente = Ark(
base_url="https://ark.ap-southeast.bytepluses.com/api/v3",
api_key=os.environ["ARK_API_KEY"],
)
recurso_id = os.environ["ARK_ASSET_ID"]
tarea = cliente.content_generation.tasks.create(
model=os.environ["ARK_MODEL_ID"],
content=[
{"type": "text", "text": "Plano medio horizontal del personaje de la Imagen 1. Saluda a cámara y dice en español: Hola, soy Luna. Luz suave y fondo de taller."},
{"type": "image_url", "role": "reference_image",
"image_url": {"url": f"asset://{recurso_id}"}},
],
duration=5,
ratio="16:9",
generate_audio=True,
watermark=True,
)
print("Tarea creada:", tarea.id)
limite = time.monotonic() + 600
while time.monotonic() < limite:
resultado = cliente.content_generation.tasks.get(task_id=tarea.id)
if resultado.status == "succeeded":
print("Vídeo terminado:", resultado.content)
break
if resultado.status == "failed":
raise RuntimeError(f"La generación ha fallado: {resultado.error}")
print("Estado:", resultado.status)
time.sleep(10)
else:
raise TimeoutError(f"La tarea sigue pendiente. Conserva su ID: {tarea.id}")Guarda el JSON anterior como solicitud-personaje.json, sustituye modelo y recurso, y configura ARK_API_KEY. La petición devuelve el identificador de la tarea.
curl --fail-with-body --request POST \
"https://ark.ap-southeast.bytepluses.com/api/v3/contents/generations/tasks" \
--header "Authorization: Bearer ${ARK_API_KEY}" \
--header "Content-Type: application/json" \
--data-binary @solicitud-personaje.jsonEstas son las cinco referencias visuales de la guía. La voz es una referencia de audio independiente y conserva su propia numeración.





Prompt propio para explicar la asignación. Las imágenes proceden de la guía enlazada; los identificadores reales deben obtenerse desde tu biblioteca.
ListAssets permite combinar filtros de grupo, nombre y estado. Para personajes virtuales, utiliza Filter.GroupType: AIGC. Con Statuses: ["Active"] recuperas referencias listas para usar.
Para paginar, comienza con MaxResults y sin NextToken. Si la respuesta incluye un token, envíalo sin modificar en la siguiente petición. Termina cuando deje de aparecer. Mantén los mismos filtros, proyecto y orden. No combines este método con PageNumber y PageSize.
{
"Filter": {"GroupType": "AIGC", "Statuses": ["Active"], "Name": "Luna"},
"MaxResults": 20,
"SortBy": "CreateTime",
"SortOrder": "Desc",
"ProjectName": "default"
}Buscar referencias · ListAssets ↗
Para localizar grupos, usa ListAssetGroups. Puedes filtrar por nombre o identificadores y aplicar paginación con NextToken. Cada token corresponde a una API, cuenta y proyecto concretos: no lo reutilices en otra consulta distinta.
Un único programa permite ejecutar los cinco pasos de creación y consulta de la guía. Guarda el cuerpo JSON de cada operación en un archivo distinto. Configura las claves AK/SK mediante las variables de entorno indicadas en el código.
package main
import (
"encoding/json"
"fmt"
"os"
"github.com/byteplus-sdk/byteplus-go-sdk-v2/byteplus"
"github.com/byteplus-sdk/byteplus-go-sdk-v2/byteplus/credentials"
"github.com/byteplus-sdk/byteplus-go-sdk-v2/byteplus/session"
"github.com/byteplus-sdk/byteplus-go-sdk-v2/byteplus/universal"
)
func ejecutar() error {
ak, sk := os.Getenv("BYTEPLUS_ACCESS_KEY"), os.Getenv("BYTEPLUS_SECRET_KEY")
if ak == "" || sk == "" {
return fmt.Errorf("configura BYTEPLUS_ACCESS_KEY y BYTEPLUS_SECRET_KEY")
}
if len(os.Args) != 3 {
return fmt.Errorf("uso: go run . ACCION cuerpo.json")
}
// Este ejemplo se limita a creación y consulta.
permitidas := map[string]bool{
"CreateAssetGroup": true, "CreateAsset": true,
"GetAsset": true, "ListAssets": true, "ListAssetGroups": true,
}
accion := os.Args[1]
if !permitidas[accion] {
return fmt.Errorf("acción no incluida en este ejemplo: %s", accion)
}
contenido, err := os.ReadFile(os.Args[2])
if err != nil { return err }
var cuerpo map[string]any
if err = json.Unmarshal(contenido, &cuerpo); err != nil { return err }
configuracion := byteplus.NewConfig().
WithRegion("ap-southeast-1").
WithCredentials(credentials.NewStaticCredentials(ak, sk, ""))
sesion, err := session.NewSession(configuracion)
if err != nil { return err }
resultado, err := universal.New(sesion).DoCall(universal.RequestUniversal{
ServiceName: "ark", Action: accion, Version: "2024-01-01",
HttpMethod: universal.POST, ContentType: universal.ApplicationJSON,
}, &cuerpo)
if err != nil { return err }
salida, err := json.MarshalIndent(resultado, "", " ")
if err != nil { return err }
fmt.Println(string(salida))
return nil
}
func main() {
if err := ejecutar(); err != nil {
fmt.Fprintln(os.Stderr, "La solicitud ha fallado:", err)
os.Exit(1)
}
}# En una carpeta nueva para el ejemplo:
go mod init ejemplo-personajes
go get github.com/byteplus-sdk/byteplus-go-sdk-v2
# Guarda el programa anterior como main.go.
# Configura las variables BYTEPLUS_ACCESS_KEY y BYTEPLUS_SECRET_KEY.
go run . CreateAssetGroup grupo.jsonDespués, reutiliza el programa con CreateAsset, GetAsset, ListAssets o ListAssetGroups. Cada llamada requiere el cuerpo correspondiente.
{
"Id": "REEMPLAZA_POR_EL_ID_DEL_RECURSO",
"ProjectName": "default"
}{
"Filter": {
"GroupType": "AIGC",
"Name": "Luna"
},
"MaxResults": 20,
"SortBy": "CreateTime",
"SortOrder": "Desc",
"ProjectName": "default"
}| Operación | Para qué sirve |
|---|---|
| GetAssetGroup | Consultar nombre, descripción, tipo, proyecto y fechas de un grupo mediante su Id. |
| UpdateAsset | Cambiar el nombre de un recurso: Id, Name y ProjectName. |
| UpdateAssetGroup | Cambiar el nombre o la descripción del grupo: Id, Name, Description y ProjectName. |
| DeleteAsset | Eliminar definitivamente un recurso. Deja de estar disponible para generar vídeos. |
| DeleteAssetGroup | Eliminar definitivamente el grupo y todos sus recursos. Los grupos grandes pueden tardar más. |
Antes de limpiar una biblioteca, relaciona los identificadores con tus escenas y proyectos. Conserva los archivos originales y comprueba qué referencias siguen utilizándose.
La guía incluye una política de administración de recursos. Es un ejemplo amplio: permite las acciones cuyo nombre coincide con ark:*Asset*, incluidas las de eliminación, sobre todos los recursos.
{
"Statement": [
{
"Effect": "Allow",
"Action": [
"ark:*Asset*"
],
"Resource": [
"*"
]
}
]
}En IAM, crea una política, asígnala al usuario o grupo correspondiente y limita el proyecto cuando proceda. Para tareas de consulta, utiliza una política que conceda únicamente las operaciones necesarias.

Por cuenta: GetAsset, 100 solicitudes/s; DeleteAssetGroup, 5/s; creación de grupos, listados, consultas de grupos y actualizaciones, 10/s; DeleteAsset, 10/s. La cuota de CreateAsset depende de los derechos contratados.
Distribuye las consultas en el tiempo y aplica espera entre reintentos. Subir un recurso y generar un vídeo son operaciones distintas: espera a que la referencia esté preparada antes de enviar la escena.
Si no encuentras un recurso o la generación no puede utilizarlo, comprueba que biblioteca y endpoint pertenezcan al mismo proyecto. Los permisos se administran mediante IAM.
Para diagnosticar un fallo, guarda la operación, el identificador de solicitud y el mensaje de error. Evita incluir claves secretas en los registros.