|
import * as formidable from 'formidable'; |
|
import Replicate from 'replicate'; |
|
|
|
export const config = { |
|
api: { |
|
bodyParser: false, |
|
}, |
|
}; |
|
|
|
export default async function handler(req, res) { |
|
const form = new formidable.IncomingForm(); |
|
|
|
form.parse(req, async (err, fields, files) => { |
|
if (err) { |
|
console.error('Error parsing form data:', err); |
|
return res.status(400).json({ error: 'Error parsing form data' }); |
|
} |
|
|
|
try { |
|
const inputData = { |
|
prompt: fields.prompt?.toString(), |
|
negative_prompt: fields.negative_prompt?.toString(), |
|
scheduler: fields.scheduler?.toString(), |
|
seed: parseInt(fields.seed?.toString() || "0"), |
|
refine: fields.refine?.toString(), |
|
refine_steps: parseInt(fields.refine_steps?.toString() || "0") |
|
}; |
|
|
|
const replicate = new Replicate({ |
|
auth: process.env.NEXT_PUBLIC_REPLICATE_API_TOKEN, |
|
}); |
|
|
|
const prediction = await replicate.predictions.create({ |
|
version: "67ed00e8999fecd32035074fa0f2e9a31ee03b57a8415e6a5e2f93a242ddd8d2", |
|
input: inputData, |
|
}); |
|
|
|
console.log('Prediction created:', prediction); |
|
|
|
|
|
let isPredictionDone = false; |
|
let currentPrediction; |
|
while (!isPredictionDone) { |
|
console.log('Waiting for prediction to complete...'); |
|
await new Promise(resolve => setTimeout(resolve, 2000)); |
|
|
|
|
|
currentPrediction = await replicate.predictions.get(prediction.id); |
|
|
|
if (currentPrediction && currentPrediction.status === 'succeeded') { |
|
isPredictionDone = true; |
|
console.log('Prediction completed.'); |
|
break; |
|
} |
|
} |
|
|
|
console.log('Final Prediction Result:', currentPrediction); |
|
return res.status(200).json({ prediction: currentPrediction, videoUrl: currentPrediction.videoUrl }); |
|
} catch (error) { |
|
console.error('An error occurred:', error); |
|
return res.status(500).json({ error: 'Internal Server Error' }); |
|
} |
|
}); |
|
} |
|
|