curl
bash
export GENSTA_API_KEY="your-secret-key"
curl --silent --show-error --fail-with-body \
-X POST "https://api-platform.gensta.ai/v1/generations" \
-H "Authorization: Bearer $GENSTA_API_KEY" \
-H "Idempotency-Key: order-8493-shot-1" \
-H "Content-Type: application/json" \
-d '{
"model": "wan-3.0",
"mode": "text_to_video",
"variant": "standard",
"parameters": {
"resolution": "720p",
"duration_seconds": 5,
"ratio": "16:9",
"audio": true,
"prompt_extend": false,
"watermark": false
},
"input": {
"prompt": "A paper boat crosses a rain puddle, macro lens"
}
}'TypeScript
typescript
import { randomUUID } from "node:crypto";
const baseUrl = "https://api-platform.gensta.ai/v1";
const apiKey = process.env.GENSTA_API_KEY;
if (!apiKey) throw new Error("GENSTA_API_KEY is required");
const create = await fetch(baseUrl + "/generations", {
method: "POST",
headers: {
Authorization: "Bearer " + apiKey,
"Content-Type": "application/json",
"Idempotency-Key": randomUUID(),
},
body: JSON.stringify({
"model": "wan-3.0",
"mode": "text_to_video",
"variant": "standard",
"parameters": {
"resolution": "720p",
"duration_seconds": 5,
"ratio": "16:9",
"audio": true,
"prompt_extend": false,
"watermark": false
},
"input": {
"prompt": "A paper boat crosses a rain puddle, macro lens"
}
}),
});
if (!create.ok) throw new Error(await create.text());
const generation = await create.json();
while (true) {
await new Promise((resolve) => setTimeout(resolve, 10_000));
const response = await fetch(baseUrl + "/generations/" + generation.id, {
headers: { Authorization: "Bearer " + apiKey },
});
const current = await response.json();
if (current.status === "succeeded") {
console.log(current.artifacts[0]?.download_url);
break;
}
if (["failed", "canceled"].includes(current.status)) throw new Error(current.status);
}Python
python
import json, os, time, uuid
from urllib.request import Request, urlopen
base_url = "https://api-platform.gensta.ai/v1"
api_key = os.environ["GENSTA_API_KEY"]
payload = json.loads("{\n \"model\": \"wan-3.0\",\n \"mode\": \"text_to_video\",\n \"variant\": \"standard\",\n \"parameters\": {\n \"resolution\": \"720p\",\n \"duration_seconds\": 5,\n \"ratio\": \"16:9\",\n \"audio\": true,\n \"prompt_extend\": false,\n \"watermark\": false\n },\n \"input\": {\n \"prompt\": \"A paper boat crosses a rain puddle, macro lens\"\n }\n}")
request = Request(
base_url + "/generations",
data=json.dumps(payload).encode(),
method="POST",
headers={
"Authorization": "Bearer " + api_key,
"Content-Type": "application/json",
"Idempotency-Key": str(uuid.uuid4()),
},
)
with urlopen(request) as response:
generation = json.load(response)
while True:
time.sleep(10)
request = Request(base_url + "/generations/" + generation["id"], headers={"Authorization": "Bearer " + api_key})
with urlopen(request) as response:
current = json.load(response)
if current["status"] == "succeeded":
print(current["artifacts"][0]["download_url"])
break
if current["status"] in {"failed", "canceled"}:
raise RuntimeError(current["status"])
В рабочем приложении сохраняйте ID генерации и постепенно увеличивайте интервал между повторными GET после временных ошибок. Не создавайте новую генерацию только из-за локального тайм-аута.