hts/apps/migrant/app/api/text-to-image/route.ts

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 }));
}