GetAPI.ONE
Générer une vidéo avec l’API de tâches ONE
Envoyez une tâche vidéo au format OpenAI, conservez son identifiant public, interrogez la route d’état ONE exacte jusqu’à un état terminal et ne récupérez le contenu qu’après achèvement.
Confirmer le protocole avant toute dépense
- Choisissez un modèle actuel du catalogue qui déclare explicitement le point de terminaison vidéo OpenAI.
- Consultez les tarifs en direct et les champs d’entrée pris en charge par le modèle ; les travaux vidéo peuvent être asynchrones et facturables.
- Utilisez une invite courte et à faible risque pour le premier test accepté.
POST https://www.getapi.one/v1/videos
GET https://www.getapi.one/v1/videos/{task_id}
GET https://www.getapi.one/v1/videos/{task_id}/contentEnvoyer, interroger et récupérer
- Envoyer POST https://www.getapi.one/v1/videos et enregistrer exactement l’identifiant de tâche renvoyé.
- Interroger GET https://www.getapi.one/v1/videos/{task_id} à intervalle fixe avec un nombre limité de contrôles ; ne créez pas une nouvelle tâche pendant l’attente.
- Poursuivre pour queued ou in_progress ; ne terminer avec succès que pour completed.
- Arrêter et présenter l’erreur pour failed. Traiter les états inconnus comme des échecs et conserver la réponse pour diagnostic.
- Après completed, récupérer GET https://www.getapi.one/v1/videos/{task_id}/content.
- Diffuser le contenu par blocs de taille fixe sous une limite cumulative. L’exemple utilise un plafond local de 512 MiB et supprime son fichier partiel en cas d’échec de lecture, validation, écriture ou annulation.
curl --fail-with-body https://www.getapi.one/v1/videos \
-H "Authorization: Bearer $GETAPI_ONE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "<OPENAI_VIDEO_MODEL_ID_FROM_CURRENT_CATALOG>",
"prompt": "A five-second locked-camera product turntable on a neutral background"
}' > video-submit.jsonimport json
import os
import time
from pathlib import Path
from urllib.parse import quote
from urllib.request import Request, urlopen
base_url = "https://www.getapi.one"
api_key = os.environ["GETAPI_ONE_API_KEY"]
submitted = json.loads(Path("video-submit.json").read_text(encoding="utf-8"))
task_id = submitted.get("id") or submitted.get("task_id")
if not task_id:
raise ValueError("Submit response did not contain id or task_id")
safe_id = quote(task_id, safe="")
headers = {"Authorization": f"Bearer {api_key}"}
for attempt in range(30):
request = Request(f"{base_url}/v1/videos/{safe_id}", headers=headers)
with urlopen(request, timeout=30) as response:
task = json.load(response)
status = task.get("status")
if status == "completed":
break
if status == "failed":
raise RuntimeError(f"video task failed: {task.get('error')}")
if status not in {"queued", "in_progress"}:
raise RuntimeError(f"unknown non-success status: {status}")
if attempt == 29:
raise TimeoutError("video was not complete after 30 status checks")
time.sleep(10)
content_request = Request(
f"{base_url}/v1/videos/{safe_id}/content",
headers=headers,
)
MAX_VIDEO_BYTES = 512 * 1024 * 1024
CHUNK_BYTES = 1024 * 1024
output_path = Path("result.mp4")
created_output = False
with urlopen(content_request, timeout=60) as response:
content_type = response.headers.get_content_type()
if not content_type.startswith("video/"):
raise ValueError(f"unexpected content type: {content_type}")
try:
output = output_path.open("xb")
created_output = True
with output:
total_bytes = 0
while chunk := response.read(CHUNK_BYTES):
total_bytes += len(chunk)
if total_bytes > MAX_VIDEO_BYTES:
raise ValueError("video exceeds the local 512 MiB limit")
output.write(chunk)
except BaseException:
if created_output:
output_path.unlink(missing_ok=True)
raiseImplémenter la machine à états
| État | Action du client |
|---|---|
| queued | Attendre l’intervalle fixe, puis interroger le même identifiant de tâche dans la limite du nombre de contrôles. |
| in_progress | Afficher la progression si elle est fournie et poursuivre les interrogations. |
| completed | Arrêter l’interrogation et demander la route de contenu. |
| failed | Arrêter l’interrogation, enregistrer les détails d’erreur sûrs et exiger une nouvelle tentative intentionnelle. |
Vérifier le résultat attendu
- La réponse d’envoi fournit un identifiant de tâche et le client le conserve assez durablement pour la procédure.
- Chaque requête d’état utilise le même identifiant et ne crée jamais de travail en double.
- Le contenu téléchargé présente un type vidéo et ne s’ouvre qu’après l’état completed.
Récupérer sans dupliquer les tâches
- Si l’envoi expire, ne le répétez pas aveuglément : vérifiez si un identifiant de tâche ou un enregistrement de console a été créé.
- En cas de 404 pendant l’interrogation, vérifiez l’identifiant public de tâche, la route exacte au singulier ou au pluriel et la même clé de compte.
- En cas d’échec, conservez le modèle, un résumé sûr de la requête, l’identifiant de tâche et les détails de l’erreur avant de modifier les entrées.
Protéger les tâches et résultats multimédias
- Conservez la clé et la recherche de tâche dans votre backend authentifié.
- Validez les invites, téléversements, durées, dimensions et nombres selon le contrat du modèle sélectionné avant de les transmettre.
- Stockez les résultats approuvés dans un stockage contrôlé ; ne supposez pas qu’une URL de contenu est permanente ou sûre pour le public.
- Définissez une limite cumulative de téléchargement inférieure à votre budget mémoire et stockage, diffusez des blocs de taille fixe et supprimez les artefacts partiels si le téléchargement ne se termine pas.