in packages/inference/src/providers/novita.ts [79:166]
override async getResponse(
response: NovitaAsyncAPIOutput,
url?: string,
headers?: Record<string, string>
): Promise<Blob> {
if (!url || !headers) {
throw new InferenceClientInputError("URL and headers are required for text-to-video task");
}
const taskId = response.task_id;
if (!taskId) {
throw new InferenceClientProviderOutputError(
"Received malformed response from Novita text-to-video API: no task ID found in the response"
);
}
const parsedUrl = new URL(url);
const baseUrl = `${parsedUrl.protocol}//${parsedUrl.host}${
parsedUrl.host === "router.huggingface.co" ? "/novita" : ""
}`;
const resultUrl = `${baseUrl}/v3/async/task-result?task_id=${taskId}`;
let status = "";
let taskResult: unknown;
while (status !== "TASK_STATUS_SUCCEED" && status !== "TASK_STATUS_FAILED") {
await delay(500);
const resultResponse = await fetch(resultUrl, { headers });
if (!resultResponse.ok) {
throw new InferenceClientProviderApiError(
"Failed to fetch task result",
{ url: resultUrl, method: "GET", headers },
{
requestId: resultResponse.headers.get("x-request-id") ?? "",
status: resultResponse.status,
body: await resultResponse.text(),
}
);
}
try {
taskResult = await resultResponse.json();
if (
taskResult &&
typeof taskResult === "object" &&
"task" in taskResult &&
taskResult.task &&
typeof taskResult.task === "object" &&
"status" in taskResult.task &&
typeof taskResult.task.status === "string"
) {
status = taskResult.task.status;
} else {
throw new InferenceClientProviderOutputError(
"Received malformed response from Novita text-to-video API: failed to get task status"
);
}
} catch (error) {
throw new InferenceClientProviderOutputError(
"Received malformed response from Novita text-to-video API: failed to parse task result"
);
}
}
if (status === "TASK_STATUS_FAILED") {
throw new InferenceClientProviderOutputError("Novita text-to-video task failed");
}
if (
typeof taskResult === "object" &&
!!taskResult &&
"videos" in taskResult &&
typeof taskResult.videos === "object" &&
!!taskResult.videos &&
Array.isArray(taskResult.videos) &&
taskResult.videos.length > 0 &&
"video_url" in taskResult.videos[0] &&
typeof taskResult.videos[0].video_url === "string" &&
isUrl(taskResult.videos[0].video_url)
) {
const urlResponse = await fetch(taskResult.videos[0].video_url);
return await urlResponse.blob();
} else {
throw new InferenceClientProviderOutputError(
`Received malformed response from Novita text-to-video API: expected { videos: [{ video_url: string }] } format, got instead: ${JSON.stringify(
taskResult
)}`
);
}
}