diff --git a/.env.example b/.env.example index 70f541d..d6985e4 100644 --- a/.env.example +++ b/.env.example @@ -60,8 +60,8 @@ FREE_TIMES=2 REPLICATE_WEBHOOK= # replicate 的 API token,需要去你的 replicate 账号里面复制 https://replicate.com/account/api-tokens REPLICATE_API_TOKEN= -# 生成贴纸的API版本 https://replicate.com/fofr/sticker-maker/versions ,最新的那个版本只生成一张图片了,下方这个版本是还会一次生成两张图片的 -REPLICATE_API_VERSION="6443cc831f51eb01333f50b757157411d7cadb6215144cc721e3688b70004ad0" +# 生成图片的API模型 使用 Google Gemini 2.5 Flash Image +REPLICATE_API_MODEL="google/gemini-2.5-flash-image" #-------------------------------------------------------------------------------------------------------- # cloudflare R2 config diff --git a/package.json b/package.json index 5d2d4dc..c1a64ca 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev --port 80", + "dev": "next dev --port 3000", "build": "next build", "start": "next start" }, diff --git a/src/app/[locale]/api/generate/callByReplicate/route.ts b/src/app/[locale]/api/generate/callByReplicate/route.ts index 6057913..f39c64e 100644 --- a/src/app/[locale]/api/generate/callByReplicate/route.ts +++ b/src/app/[locale]/api/generate/callByReplicate/route.ts @@ -12,11 +12,11 @@ export const POST = async (req: Request) => { const output = json.output; console.log('callByReplicate ==>json.output==>', output); - // 使用fetch API下载文件,output是一个数组,可能多个 - const len = output.length; + // 使用fetch API下载文件,output可能是字符串或数组 + const urls = Array.isArray(output) ? output : [output]; const output_urls = []; - for (let i = 0; i < len; i++) { - const url = output[i]; + for (let i = 0; i < urls.length; i++) { + const url = urls[i]; const currentFileContent = await fetch(url) .then((v) => v.arrayBuffer()) .then(Buffer.from); diff --git a/src/app/[locale]/api/generate/handle/route.ts b/src/app/[locale]/api/generate/handle/route.ts index 644f398..870fa4e 100644 --- a/src/app/[locale]/api/generate/handle/route.ts +++ b/src/app/[locale]/api/generate/handle/route.ts @@ -58,7 +58,7 @@ export async function POST(req: Request, res: Response) { const origin_language = await getLanguage(textStr); const input = await getInput(textStr, checkSubscribeStatus); await replicateClient.predictions.create({ - version: process.env.REPLICATE_API_VERSION, + model: process.env.REPLICATE_API_MODEL, input: input, webhook: `${process.env.REPLICATE_WEBHOOK}/api/generate/callByReplicate?uid=${uid}`, webhook_events_filter: ["completed"], diff --git a/src/libs/replicate.ts b/src/libs/replicate.ts index 589b7de..333d13c 100644 --- a/src/libs/replicate.ts +++ b/src/libs/replicate.ts @@ -5,21 +5,21 @@ export const getInput = async (textStr, checkSubscribeStatus) => { // 翻译成英语后返回 const revised_text = await translateContent(textStr, 'en'); - let width = 512; - let height = 512; - let upscale = false; + // 为 Gemini 2.5 Flash Image 构建更详细的提示词 + let enhancedPrompt = `Create a high-quality sticker image: ${revised_text}. +Style: Clean, vibrant, cartoon-like sticker design with clear outlines. +Requirements: Suitable for all ages, no inappropriate content, professional quality.`; + + // 如果是订阅用户,可以添加更高质量的描述 if (checkSubscribeStatus) { - width = 1024; - height = 1024 + enhancedPrompt = `Create a premium high-quality sticker image: ${revised_text}. +Style: Professional cartoon/anime style with vibrant colors, detailed artwork, clean vector-like appearance. +Quality: High resolution, crisp lines, suitable for printing and digital use. +Requirements: Family-friendly content, no inappropriate material, premium design quality.`; } return { - steps: 20, - width: width, - height: height, - prompt: revised_text, - upscale: upscale, - upscale_steps: 2, - negative_prompt: "NSFW. No nudity or explicit content.No violence or gore.No sexual themes.Suitable for all ages.No illegal activities or substances.General audience appropriate.No offensive material.No hate speech or discrimination.Nothing disturbing or shocking.Respectful, non-exploitative content." + prompt: enhancedPrompt, + output_format: "png" // PNG format for better quality with transparency support } } diff --git a/src/servers/keyValue.ts b/src/servers/keyValue.ts index da79fe1..ade8643 100644 --- a/src/servers/keyValue.ts +++ b/src/servers/keyValue.ts @@ -9,11 +9,12 @@ export const countSticker = async (key, addCount) => { if (rows.length <= 0) { // 新增 await db.query('insert into key_value(key, value) values($1,$2)', [key, addCount]); + } else { + // 更新 + const origin = rows[0]; + const newCount = Number(origin.value) + addCount + await db.query('update key_value set value=$1 where key=$2', [newCount, key]); } - // 更新 - const origin = rows[0]; - const newCount = Number(origin.value) + addCount - await db.query('update key_value set value=$1 where key=$2', [newCount, key]); }