Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
File size: 4,433 Bytes
3d4392e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
"use server"
import { RenderRequest, RenderedScene } from "@/types/general"
// note: there is no / at the end in the variable
// so we have to add it ourselves if needed
const apiUrl = `${process.env.VIDEOCHAIN_API_URL || ""}`
const apiKey = `${process.env.VIDEOCHAIN_API_KEY || ""}`
export async function newRender({
prompt,
negativePrompt,
nbFrames,
nbSteps,
width,
height,
turbo,
shouldRenewCache,
seed,
}: {
prompt: string
negativePrompt: string
nbFrames: number
nbSteps: number
width: number
height: number
turbo: boolean
shouldRenewCache: boolean
seed?: number
}) {
if (!prompt) {
console.error(`cannot call the rendering API without a prompt, aborting..`)
throw new Error(`cannot call the rendering API without a prompt, aborting..`)
}
const cacheKey = `render/${JSON.stringify({ prompt })}`
// return await Gorgon.get(cacheKey, async () => {
let defaulResult: RenderedScene = {
renderId: "",
status: "error",
assetUrl: "",
durationInMs: 0,
maskUrl: "",
error: "failed to fetch the data",
alt: "",
segments: []
}
try {
// console.log(`calling POST ${apiUrl}/render with seed ${seed} and prompt: ${prompt}`)
const res = await fetch(`${apiUrl}/render`, {
method: "POST",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
Authorization: `Bearer ${apiKey}`,
},
body: JSON.stringify({
prompt,
negativePrompt,
// nbFrames: 8 and nbSteps: 15 --> ~10 sec generation
nbFrames, // when nbFrames is 1, we will only generate static images
nbSteps, // 20 = fast, 30 = better, 50 = best
width,
height,
seed,
actionnables: [],
segmentation: "disabled", // one day we will remove this param, to make it automatic
upscalingFactor: 1, // let's disable upscaling right now
turbo, // always use turbo mode (it's for images only anyway)
// also what could be done iw that we could use the width and height to control this
cache: shouldRenewCache ? "renew" : "use"
} as Partial<RenderRequest>),
cache: 'no-store',
// we can also use this (see https://vercel.com/blog/vercel-cache-api-nextjs-cache)
// next: { revalidate: 1 }
})
// console.log("res:", res)
// The return value is *not* serialized
// You can return Date, Map, Set, etc.
// Recommendation: handle errors
if (res.status !== 200) {
// This will activate the closest `error.js` Error Boundary
throw new Error('Failed to fetch data')
}
const response = (await res.json()) as RenderedScene
// console.log("response:", response)
return response
} catch (err) {
// console.error(err)
// Gorgon.clear(cacheKey)
return defaulResult
}
}
export async function getRender(renderId: string) {
if (!renderId) {
console.error(`cannot call the rendering API without a renderId, aborting..`)
throw new Error(`cannot call the rendering API without a renderId, aborting..`)
}
let defaulResult: RenderedScene = {
renderId: "",
status: "error",
assetUrl: "",
durationInMs: 0,
maskUrl: "",
error: "failed to fetch the data",
alt: "",
segments: []
}
try {
// console.log(`calling GET ${apiUrl}/render with renderId: ${renderId}`)
const res = await fetch(`${apiUrl}/render/${renderId}`, {
method: "GET",
headers: {
Accept: "application/json",
"Content-Type": "application/json",
Authorization: `Bearer ${apiKey}`,
},
cache: 'no-store',
// we can also use this (see https://vercel.com/blog/vercel-cache-api-nextjs-cache)
// next: { revalidate: 1 }
})
// console.log("res:", res)
// The return value is *not* serialized
// You can return Date, Map, Set, etc.
// Recommendation: handle errors
if (res.status !== 200) {
// This will activate the closest `error.js` Error Boundary
throw new Error('Failed to fetch data')
}
const response = (await res.json()) as RenderedScene
// console.log("response:", response)
return response
} catch (err) {
console.error(err)
// Gorgon.clear(cacheKey)
return defaulResult
}
} |