Spaces:
Running
Running
File size: 4,648 Bytes
3d4392e 8101ed0 3d4392e 8101ed0 3d4392e 8101ed0 3d4392e 8101ed0 3d4392e 8101ed0 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 152 153 154 155 156 157 158 159 |
"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,
nbFPS,
nbSteps,
width,
height,
turbo,
shouldRenewCache,
seed,
}: {
prompt: string
negativePrompt: string
nbFrames: number
nbFPS: 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: []
}
// console.log("fetch api:", `${apiUrl}/render`)
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
nbFPS,
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: "ignore", // shouldRenewCache ? "renew" : "use",
// this is the "blocking mode", which help us having to poll the server
wait: true,
} 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
}
} |