77 lines
2.4 KiB
TypeScript
77 lines
2.4 KiB
TypeScript
import { NFTStorage, File } from 'nft.storage';
|
|
|
|
export const runtime = 'edge'
|
|
|
|
interface GenerationResponse {
|
|
artifacts: Array<{
|
|
base64: string;
|
|
seed: number;
|
|
finishReason: string;
|
|
}>
|
|
}
|
|
|
|
const client = new NFTStorage({ token: process.env.NFT_STORAGE_API_KEY as string });
|
|
|
|
export async function POST(req: Request) {
|
|
const { text } = await req.json();
|
|
const engine_id = 'stable-diffusion-xl-1024-v1-0';
|
|
|
|
const stabilityResponse = await fetch(`https://api.stability.ai/v1/generation/${engine_id}/text-to-image`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
Accept: 'application/json',
|
|
Authorization: `Bearer ${process.env.STABILITY_API_KEY}`,
|
|
},
|
|
body: JSON.stringify({
|
|
text_prompts: [
|
|
{
|
|
text: text,
|
|
},
|
|
],
|
|
cfg_scale: 7,
|
|
height: 1024,
|
|
width: 1024,
|
|
steps: 30,
|
|
samples: 1,
|
|
}),
|
|
});
|
|
|
|
if (!stabilityResponse.ok) {
|
|
console.error(`Error in stability.ai`);
|
|
return new Response(stabilityResponse.statusText, { status: stabilityResponse.status });
|
|
}
|
|
|
|
const stabilityJSON = await stabilityResponse.json() as GenerationResponse;
|
|
|
|
// save the first artifact
|
|
const image = stabilityJSON.artifacts[0];
|
|
|
|
// Convert base64 image to Blob
|
|
const blob = await fetch(`data:image/png;base64,${image.base64}`).then(res => res.blob());
|
|
|
|
// Create a new File object with the Blob
|
|
const imageFile = new File([blob], `generated-image.png`, { type: 'image/png' });
|
|
|
|
// Upload the image to NFTStorage
|
|
const imageCid = await client.storeBlob(imageFile);
|
|
// Construct the IPFS URL for the image
|
|
const imageUrl = `ipfs://${imageCid}`;
|
|
|
|
// Create a JSON object with the constructed URL
|
|
const metadata = {
|
|
image: imageUrl
|
|
};
|
|
|
|
// Convert JSON object to Blob for uploading to NFTStorage
|
|
const metadataBlob = new Blob([JSON.stringify(metadata)], { type: 'application/json' });
|
|
const metadataFile = new File([metadataBlob], 'metadata.json');
|
|
|
|
// Upload the metadata to NFTStorage
|
|
const metadataCid = await client.storeBlob(metadataFile);
|
|
const metadataUrl = `ipfs://${metadataCid}`;
|
|
|
|
// Return the CID (IPFS address) of the uploaded metadata
|
|
return new Response(JSON.stringify({ metadataUrl: metadataUrl, imageUrl: imageUrl }));
|
|
}
|