Pro API: controla o rendering em cloud a partir do teu próprio servidor

Tudo o que a app faz online (imagens, retoques, vídeos, personagens treinados) também é acessível via HTTP, ao mesmo preço em créditos, sem precisares de ter a app aberta. Controlas tudo a partir do teu próprio servidor, dos teus scripts ou do teu agente, usando os créditos da tua licença.

Disponível com a licença Pro. A chave é criada na app, em Definições > API.

Basehttps://api.tendre.ai/pro/v1
Autenticaçãocabeçalho Authorization: Bearer tk_pro_...
FormatoJSON de entrada e saída, PNG para imagens, MP4 para vídeos
Descrição da máquinaopenapi-pro.yaml (OpenAPI 3.0), para gerar um cliente

Obter uma chave

Na app, com uma licença Pro: Definições > API > Nova chave. Dá-lhe um nome (por exemplo, "servidor de produção"), escolhe as suas permissões e, se quiseres, um limite diário de créditos e uma data de expiração.

A chave é mostrada uma única vez. Copia-a imediatamente. Uma chave perdida é substituída, nunca recuperada.

  • No máximo três chaves ativas por licença. Suficiente para fazer rotação de uma sem interromper o serviço: cria a nova, instala-a, revoga a antiga.
  • Uma chave não é um lugar. O teu computador e o teu telemóvel continuam a poder ser usados em paralelo.
  • Uma chave vale os teus créditos. Nunca a coloques numa página web, numa app distribuída ou num repositório público. Define-lhe um limite diário de créditos assim que estiver num servidor.

O que uma chave tem permissão para fazer

PermissãoO que permite
LeituraSempre concedida: estado do render, download de ficheiros, saldo, lista de personagens
ImagensSubmeter e cancelar imagens (geração, retoque, variação)
VídeosSubmeter e cancelar vídeos

Uma chamada além das permissões da chave responde com 403 portee_manquante, com a permissão em falta em portee.

O ciclo de vida do render

Sempre os mesmos três passos.

  1. Submeter. POST /images ou POST /videos. Resposta imediata com um jobId e o custo.
  2. Verificar. GET /images/{jobId} ou GET /videos/{jobId}, a cada 3 segundos, até status ser completed ou failed.
  3. Descarregar. GET /images/{jobId}/file ou GET /videos/{jobId}/file, assim que o estado for completed. O ficheiro não é guardado, por isso descarrega-o sem demora.

Tempos aproximados: 10 a 40 segundos para uma imagem, 1 a 5 minutos para um vídeo, mais tempo quando o motor arranca a frio.

A tua primeira chamada

KEY=tk_pro_...
B=https://api.tendre.ai/pro/v1
curl -s $B/credits -H "Authorization: Bearer $KEY"
{ "balance": 1830, "licenseId": "lic_...", "key": "k_1a2b3c4d",
  "limits": { "concurrent": 2, "perMinute": 60, "perDay": 0 }, "running": 0 }

Se isto responder, todo o resto vai funcionar.

Um render completo, de três formas

bash

KEY=tk_pro_...
B=https://api.tendre.ai/pro/v1
JOB=$(curl -s $B/images -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
  -d '{"prompt":"a lighthouse at dawn, photorealistic","width":1216,"height":832}' | jq -r .jobId)
until curl -s $B/images/$JOB -H "Authorization: Bearer $KEY" | grep -q '"completed"'; do sleep 3; done
curl -s $B/images/$JOB/file -H "Authorization: Bearer $KEY" -o lighthouse.png

PowerShell

$H = @{ Authorization = "Bearer tk_pro_..." }
$B = "https://api.tendre.ai/pro/v1"
$job = Invoke-RestMethod -Uri "$B/videos" -Method Post -Headers $H -ContentType "application/json" `
  -Body '{"prompt":"waves on a beach at sunset, gentle wind","width":1080,"height":1920,"audio":true}'
do { Start-Sleep 5; $s = Invoke-RestMethod -Uri "$B/videos/$($job.jobId)" -Headers $H } while ($s.status -eq "pending")
Invoke-WebRequest -Uri "https://api.tendre.ai$($s.file_url)" -Headers $H -OutFile beach.mp4

Python

import time, requests
KEY, B = "tk_pro_...", "https://api.tendre.ai/pro/v1"
H = {"Authorization": f"Bearer {KEY}"}
job = requests.post(f"{B}/videos", headers=H, json={"prompt": "waves on a beach at sunset, gentle wind", "audio": True}).json()
while (s := requests.get(f"{B}/videos/{job['jobId']}", headers=H).json())["status"] == "pending":
    time.sleep(3)
if s["status"] == "completed":
    open("beach.mp4", "wb").write(requests.get("https://api.tendre.ai" + s["file_url"], headers=H).content)
else:
    print("failed:", s.get("detail"))

O que fazer a seguir

  • Imagens: geração, os três modos de retoque, personagens.
  • Vídeos: formatos, a grelha de preços, fotogramas de início e fim.
  • Conta: saldo, limites, personagens treinados, atividade.
  • Limites e erros: limites, todos os códigos de erro, boas práticas.

O que ainda não existe

Por ordem de planeamento: treino de personagens a partir das tuas próprias fotos, vozes, upscaling para 2K, uma seed fixa para reproduzir um render, e webhooks para poderes parar de fazer polling.

A API tem versões. Tudo o que está descrito aqui mantém-se válido em /pro/v1: as adições nunca quebram o que existe, e uma mudança incompatível seria lançada como /pro/v2.

Windows · Cloud ou NVIDIA

Gera em privado. Esta noite.

Descarrega o tendre.AI, ativa uma vez e usa-o para sempre, totalmente offline, na tua própria GPU.

Descarregar para WindowsDescarregar para Android (.apk)
Descarregar para MacVersão para Mac em breve!
OS Windows 10/11GPU NVIDIA 8GB+VRAM 12GB recomendadoDisco 20GB

Não tens uma GPU NVIDIA? Começa 100% na cloud: 10 imagens grátis todos os dias, depois 1 crédito por imagem. Uma placa NVIDIA (8GB+) desbloqueia a geração local ilimitada.