작업 결과 받기
GET /v1/jobs/{id}
몇십 초에서 몇 분 걸리는 일은 작업으로 처리해요. 요청하면 결과를 기다리지 않고 바로 작업 ID를 돌려주고, 결과는 이 엔드포인트로 받아요.
| 작업으로 처리하는 엔드포인트 | 작업 종류(type) | 결과가 있는 곳 |
|---|---|---|
POST /v1/images | image | result.images[].url |
POST /v1/videos | video | result.video.url |
POST /v1/music | music | result.audio.url |
POST /v1/transcriptions | transcription | result.text, result.segments |
흐름
- 생성 요청을 보내면
202 Accepted와 작업이 와요.status는processing이에요. - 응답의
id로GET /v1/jobs/{id}?wait=60을 불러요. status가processing이면 2번을 되풀이해요.succeeded면result에서 결과를,failed면error에서 이유를 읽어요.
쿼리
| 쿼리 | 기본값 | 설명 |
|---|---|---|
wait | 0 | 끝나기를 서버에서 기다릴 최대 시간(초, 0~60). 끝나면 바로 답해요. 0이면 지금 상태만 보고 바로 답해요 |
wait=60으로 되풀이해서 부르는 게 가장 간단해요. 따로 쉬는 시간을 둘 필요가 없고, 끝나는 순간 답을 받아요.
클라이언트 타임아웃은 wait보다 넉넉하게(예: 90초) 두세요.
작업 객체
| 필드 | 설명 |
|---|---|
id | 작업 ID. 길고 서명된 문자열이에요. 그대로 저장해 두세요 |
object | 항상 job |
type | image, video, music, transcription |
model | 일한 모델 ID |
status | processing(진행 중), succeeded(완료), failed(실패) |
credits_used | 이 작업으로 차감된 크레딧. 끝났을 때 확정돼요 |
result | succeeded일 때 결과. 그 밖에는 null |
error | failed일 때 code(generation_failed)와 message. 그 밖에는 null |
{
"id": "WyJkZXZkaXZlLWltYWdlLWdwdC0yLTUtZmxhcmUi….f54806a7b0d2618ff1b0db55180904da",
"object": "job",
"type": "image",
"model": "devdive-image-gpt-2-5-flare",
"status": "succeeded",
"credits_used": 11.88,
"result": { "images": [{ "url": "https://api.devdive.ai/media/…/image.png" }] },
"error": null
}
예시
Python
import os
import time
import requests
API = "https://api.devdive.ai"
HEADERS = {"Authorization": f"Bearer {os.environ['DEVDIVE_API_KEY']}"}
def wait_for(job: dict) -> dict:
"""작업이 끝날 때까지 기다렸다가 마지막 상태를 돌려줘요."""
while job["status"] == "processing":
res = requests.get(f"{API}/v1/jobs/{job['id']}", params={"wait": 60},
headers=HEADERS, timeout=90)
if res.status_code in (429, 503):
time.sleep(int(res.headers.get("Retry-After", "5")))
continue
res.raise_for_status()
job = res.json()
return job
job = requests.post(f"{API}/v1/music", headers=HEADERS, timeout=120, json={
"lyrics": "오늘도 수고했어\n내일은 더 괜찮을 거야",
"prompt": "밝은 어쿠스틱 팝",
}).json()
done = wait_for(job)
print(done["result"]["audio"]["url"] if done["status"] == "succeeded" else done["error"]["message"])
Node.js
const API = "https://api.devdive.ai";
const headers = { Authorization: `Bearer ${process.env.DEVDIVE_API_KEY}` };
async function waitFor(job) {
while (job.status === "processing") {
const res = await fetch(`${API}/v1/jobs/${encodeURIComponent(job.id)}?wait=60`, { headers });
if (res.status === 429 || res.status === 503) {
const seconds = Number(res.headers.get("Retry-After") ?? 5);
await new Promise((resolve) => setTimeout(resolve, seconds * 1000));
continue;
}
if (!res.ok) throw new Error((await res.json()).error.message);
job = await res.json();
}
return job;
}
알아 두기
- 다시 만들지 마세요. 기다리다 연결이 끊기거나 타임아웃이 나도 작업은 서버에서 계속돼요. 같은 작업 ID로 다시 확인하세요. 생성 요청을 다시 보내면 새로 만들고 다시 차감돼요.
- 작업 ID는 그 작업을 맡긴 계정의 키로만 열 수 있어요.
wait중에 잠깐 연결이 흔들려도 서버가 계속 확인해요. 그래도 확인이 안 되면503과Retry-After가 와요.- 결과 파일 링크는 3일 동안 열려요. 오래 둘 파일은 내려받아 저장하세요. 지난 결과는
GET /v1/files로 다시 찾을 수 있어요.