Ir para o conteúdo

Diretor de cena

O usuário pede um vídeo; o agente cria o quadro inicial, o quadro final e renderiza o clipe interpolando entre os dois — com job assíncrono e progresso na conversa.

Atualizado em 01 de set. de 2026

O pedido é simples — "quero um vídeo de um filhote que acorda e olha pra câmera" — e o resultado é um clipe com narrativa: o agente decide o que existe no começo e no fim da cena, gera as duas imagens, e manda o modelo de vídeo interpolar o movimento entre elas.

O truque técnico é o modo primeiro/último quadro do /v1/videos (images: [inicial, final]), somado ao modo assíncrono ("async": true): a rota responde na hora com um job_id, o agente avisa o progresso e consulta o resultado — nada fica pendurado esperando os ~2 minutos da renderização.

Custo por clipe

Nas configurações do exemplo: 2 imagens (flux-2-dev, ~$0,03 cada) + 5s de vídeo (seedance-2.0-mini, ~$0,58) ≈ US$ 0,64 por clipe. O prompt instrui o agente a confirmar antes de gerar vários.

Como importar

Na plataforma: Agents → Importar, escolha o arquivo baixado. Ele entra como um rascunho novo (nada existente é alterado), com ids de observabilidade renovados. Depois preencha o que é do seu ambiente — credenciais, URLs e bases de conhecimento — e publique.

O arquivo

scene-director.hinow-agent.jsonjson
{
 "format": "hinow.agent",
 "version": 1,
 "exported_at": "2026-09-01T00:00:00Z",
 "credentials_included": false,
 "agent": {
  "name": "Diretor de cena",
  "description": "O usuário pede um vídeo; o agente cria o quadro inicial, o quadro final e renderiza o clipe interpolando entre os dois — job assíncrono, com progresso na conversa.",
  "avatar": null,
  "model": null,
  "system_prompt": null,
  "config": {},
  "tools": null,
  "workflow": {
   "nodes": [
    {
     "id": "start",
     "type": "start",
     "position": {
      "x": 300,
      "y": 0
     },
     "data": {
      "label": "Início",
      "variables": []
     }
    },
    {
     "id": "agent-1",
     "type": "agent",
     "position": {
      "x": 290,
      "y": 160
     },
     "data": {
      "name": "diretor",
      "model": "hinow/himax",
      "system_prompt": "Você é um diretor de cena: transforma um pedido de vídeo em um clipe curto com narrativa.\n\nO MÉTODO (siga sempre, avisando o usuário a cada etapa)\n1. Entenda a cena: o que existe no COMEÇO e o que existe no FIM. Se o pedido não deixar claro, proponha você mesmo um começo e um fim em uma frase e siga.\n2. Diga \"🎬 Criando o quadro inicial...\" e chame gerar_imagem com um prompt visual rico EM INGLÊS do primeiro quadro (cena, luz, enquadramento, estilo). Use model=black-forest-labs/flux-2-dev e n=1.\n3. Diga \"🎬 Agora o quadro final...\" e gere o último quadro com o MESMO cenário, mesma luz e mesmo enquadramento — só o que a narrativa muda deve mudar.\n4. Mostre as duas imagens (markdown de imagem) e chame gerar_video com: model=bytedance/seedance-2.0-mini, images=[url_inicial, url_final] NESTA ORDEM, duration=5 e um prompt EM INGLÊS do MOVIMENTO entre os quadros. Ela responde NA HORA com um job_id — o vídeo continua sendo renderizado no servidor.\n5. Avise: \"🎬 Vídeo em renderização (~2 minutos)...\" e consulte consultar_video com o job_id. Se status for queued/running, consulte no máximo mais 3 vezes; se ainda não tiver terminado, ESCREVA O CÓDIGO DO JOB NA SUA MENSAGEM (ex.: `job: 8370e7b8-…`, o id completo) e diga que o usuário pode perguntar \"e aí?\" em um instante. IMPORTANTE: só o que você escreve fica na conversa — na próxima mensagem, retome o job pelo código que VOCÊ anotou, nunca invente um.\n6. Quando status=succeeded, entregue a URL do mp4 exatamente como veio em result.urls[0] e descreva a cena em uma frase.\n\nREGRAS\n- URLs sempre exatamente como as ferramentas devolveram — nunca invente nem encurte.\n- Os dois quadros devem parecer o mesmo lugar: repita cenário, paleta e enquadramento nos dois prompts.\n- Se uma etapa falhar, diga qual foi e o erro — não repita mais de uma vez sem avisar.\n- Um vídeo por pedido. Custo aproximado: US$ 0,70 por clipe — se pedirem vários, confirme antes.",
      "config": {
       "temperature": 0.6,
       "max_tool_loops": 12
      }
     }
    },
    {
     "id": "hook-1",
     "type": "webhook",
     "position": {
      "x": 575,
      "y": 160
     },
     "data": {
      "label": "HINOW mídia",
      "config": {
       "name": "HINOW mídia",
       "baseUrl": "https://api.hinow.ai/v1",
       "timeout": 30000,
       "auth": {
        "type": "bearer",
        "token": "COLE_SUA_API_KEY_hi"
       },
       "retryOnError": false,
       "maxRetries": 0,
       "routes": [
        {
         "id": "r1",
         "name": "gerar_imagem",
         "method": "POST",
         "path": "/images",
         "description": "Gera uma imagem a partir de um prompt e devolve a URL pública.",
         "whenToUse": "Para criar o quadro inicial e o quadro final da cena.",
         "responseDescription": "data.urls[0] é a URL pública da imagem. data.cost.amount é o custo.",
         "bodyTemplate": "{\"model\": \"{{model}}\", \"prompt\": \"{{prompt}}\", \"n\": {{n}}}",
         "parameters": [
          {
           "name": "model",
           "type": "string",
           "required": true,
           "description": "Modelo de imagem",
           "example": "black-forest-labs/flux-2-dev"
          },
          {
           "name": "prompt",
           "type": "string",
           "required": true,
           "description": "Descrição visual detalhada, em inglês"
          },
          {
           "name": "n",
           "type": "number",
           "required": true,
           "description": "Quantas imagens. Sempre 1",
           "example": "1"
          }
         ],
         "enabled": true
        },
        {
         "id": "r2",
         "name": "gerar_video",
         "method": "POST",
         "path": "/videos",
         "description": "Inicia a renderização do vídeo interpolando do primeiro ao último quadro. Responde na hora com um job_id.",
         "whenToUse": "Depois de ter as DUAS imagens prontas. images[0]=quadro inicial, images[1]=quadro final. Depois acompanhe com consultar_video.",
         "responseDescription": "202 com data.job_id e data.poll_url. A renderização continua no servidor.",
         "parameters": [
          {
           "name": "model",
           "type": "string",
           "required": true,
           "description": "Modelo de vídeo",
           "example": "bytedance/seedance-2.0-mini"
          },
          {
           "name": "prompt",
           "type": "string",
           "required": true,
           "description": "O movimento entre os quadros, em inglês"
          },
          {
           "name": "images",
           "type": "array",
           "required": true,
           "description": "[url_quadro_inicial, url_quadro_final], nesta ordem",
           "howToObtain": "As URLs devolvidas por gerar_imagem"
          },
          {
           "name": "duration",
           "type": "number",
           "required": true,
           "description": "Segundos de vídeo. Use 5",
           "example": "5"
          }
         ],
         "enabled": true,
         "bodyTemplate": "{\"model\": \"{{model}}\", \"prompt\": \"{{prompt}}\", \"images\": \"{{images}}\", \"image_mode\": \"frames\", \"duration\": {{duration}}, \"async\": true}"
        },
        {
         "id": "r3",
         "name": "consultar_video",
         "method": "GET",
         "path": "/media/jobs/{{job_id}}",
         "description": "Consulta o andamento da renderização do vídeo.",
         "whenToUse": "Depois de gerar_video, com o job_id devolvido. Repita enquanto status for queued/running (máx. 4 por turno).",
         "responseDescription": "data.status: queued | running | succeeded | failed. Quando succeeded, data.result.urls[0] é o mp4 e data.result.cost o custo.",
         "parameters": [
          {
           "name": "job_id",
           "type": "string",
           "required": true,
           "description": "Id do job",
           "howToObtain": "Veio da resposta de gerar_video",
           "example": "7796d83b-..."
          }
         ],
         "enabled": true
        }
       ]
      }
     }
    },
    {
     "id": "end-1",
     "type": "end",
     "position": {
      "x": 305,
      "y": 330
     },
     "data": {
      "label": "Fim",
      "status": "success"
     }
    }
   ],
   "edges": [
    {
     "id": "e1",
     "source": "start",
     "target": "agent-1"
    },
    {
     "id": "e2",
     "source": "hook-1",
     "target": "agent-1",
     "sourceHandle": "tool",
     "targetHandle": "slot-1"
    },
    {
     "id": "e3",
     "source": "agent-1",
     "target": "end-1"
    }
   ]
  }
 }
}

Card a card

CardPor que está aquiO que faz
**Agent diretor**O roteirista.Transforma o pedido em dois prompts visuais EM INGLÊS com o mesmo cenário/luz/enquadramento (só a narrativa muda), e descreve o MOVIMENTO entre os quadros para o modelo de vídeo.
**Webhook → api.hinow.ai** (3 rotas)A própria API da HINOW como ferramenta.gerar_imagem (POST /images), gerar_video (POST /videos com async: true) e consultar_video (GET /media/jobs/{{job_id}}). Bearer = sua chave hi_....

O padrão assíncrono na conversa

  1. 1

    Gera os dois quadros e mostra

    O usuário vê as imagens antes do vídeo — e pode corrigir a cena barato, sem pagar a renderização.

  2. 2

    Dispara o vídeo e recebe o job na hora

    gerar_video com images:[inicial, final] e "async": true responde em milissegundos com job_id + poll_url.

  3. 3

    Consulta algumas vezes e, se preciso, adia

    Até 3 consultas no turno; se ainda estiver renderizando, o agente escreve o código do job na mensagem e convida o usuário a perguntar "e aí?".

  4. 4

    O "e aí?" retoma pelo código

    A conversa continua no mesmo thread_id; o agente relê o job anotado, consulta de novo e entrega a URL do mp4 exatamente como voltou.

Por que anotar o job na mensagem

O histórico do thread guarda o texto da conversa — não os resultados de ferramenta. Um id que só existiu num retorno de tool não sobrevive ao turno; escrito na mensagem, sobrevive. É a regra de ouro de qualquer fluxo assíncrono em conversa.

Como adaptar ao seu caso

  • Cole a sua chave hi_... no auth.token do card (o arquivo vem com placeholder).
  • Qualidade acima de custo: troque os modelos nos prompts do sistema — seedream-5-lite nas imagens e veo-31 no vídeo mudam o patamar (e o preço).
  • Clipe maior: duration até o limite do modelo; o job assíncrono aguenta renderizações longas (deadline de 35 min).
  • Sem narrativa, só animar uma foto: mande uma imagem só em images — vira image-to-video simples.

Todos os fluxos prontos

Outros agents completos para importar e adaptar.