diff --git a/src/app/api/simulator/[id]/execute/route.ts b/src/app/api/simulator/[id]/execute/route.ts index f70134b..3ca833f 100644 --- a/src/app/api/simulator/[id]/execute/route.ts +++ b/src/app/api/simulator/[id]/execute/route.ts @@ -37,20 +37,30 @@ const IMAGE_MODEL_ADAPTERS: Record = { name: 'Gemini 2.5 Flash Image Preview', prepareRequest: (userInput: string, promptContent: string, params: Record) => ({ model: 'google/gemini-2.5-flash-image-preview', - contents: [{ - parts: [{ - text: `${promptContent}\n\nUser input: ${userInput}` - }] + messages: [{ + role: 'user', + content: `${promptContent}\n\nUser input: ${userInput}` }], - generationConfig: { - temperature: params.temperature || 0.7, - maxOutputTokens: params.maxTokens || 1024 - } + temperature: params.temperature || 0.7, + ...(params.maxTokens ? { max_tokens: params.maxTokens } : {}), + ...(params.topP ? { top_p: params.topP } : {}), + ...(params.frequencyPenalty ? { frequency_penalty: params.frequencyPenalty } : {}), + ...(params.presencePenalty ? { presence_penalty: params.presencePenalty } : {}) }), - parseResponse: (response: Record) => ({ - content: (response as { candidates?: Array<{ content?: { parts?: Array<{ text?: string }> } }>; generated_image_url?: string }).candidates?.[0]?.content?.parts?.[0]?.text || (response as { generated_image_url?: string }).generated_image_url || 'Image generated successfully', - outputType: 'image' - }) + parseResponse: (response: Record) => { + // 尝试从不同的响应格式中提取内容 + const choices = (response as { choices?: Array<{ message?: { content?: string } }> }).choices + const content = choices?.[0]?.message?.content || '' + + // 从内容中提取图像URL + const urlMatch = content.match(/https?:\/\/[^\s<>"']*\.(?:png|jpg|jpeg|gif|webp|bmp|svg)(?:\?[^\s<>"']*)?/i) + const imageUrl = urlMatch?.[0] || '' + + return { + content: imageUrl || content || 'Image generation completed', + outputType: 'image' + } + } } }; diff --git a/src/app/api/simulator/route.ts b/src/app/api/simulator/route.ts index 9614565..10d1f59 100644 --- a/src/app/api/simulator/route.ts +++ b/src/app/api/simulator/route.ts @@ -33,20 +33,30 @@ const IMAGE_MODEL_ADAPTERS: Record = { name: 'Gemini 2.5 Flash Image Preview', prepareRequest: (userInput: string, promptContent: string, params: Record) => ({ model: 'google/gemini-2.5-flash-image-preview', - contents: [{ - parts: [{ - text: `${promptContent}\n\nUser input: ${userInput}` - }] + messages: [{ + role: 'user', + content: `${promptContent}\n\nUser input: ${userInput}` }], - generationConfig: { - temperature: params.temperature || 0.7, - maxOutputTokens: params.maxTokens || 1024 - } + temperature: params.temperature || 0.7, + ...(params.maxTokens ? { max_tokens: params.maxTokens } : {}), + ...(params.topP ? { top_p: params.topP } : {}), + ...(params.frequencyPenalty ? { frequency_penalty: params.frequencyPenalty } : {}), + ...(params.presencePenalty ? { presence_penalty: params.presencePenalty } : {}) }), - parseResponse: (response: Record) => ({ - content: (response as { candidates?: Array<{ content?: { parts?: Array<{ text?: string }> } }>; generated_image_url?: string }).candidates?.[0]?.content?.parts?.[0]?.text || (response as { generated_image_url?: string }).generated_image_url || 'Image generated successfully', - outputType: 'image' - }) + parseResponse: (response: Record) => { + // 尝试从不同的响应格式中提取内容 + const choices = (response as { choices?: Array<{ message?: { content?: string } }> }).choices + const content = choices?.[0]?.message?.content || '' + + // 从内容中提取图像URL + const urlMatch = content.match(/https?:\/\/[^\s<>"']*\.(?:png|jpg|jpeg|gif|webp|bmp|svg)(?:\?[^\s<>"']*)?/i) + const imageUrl = urlMatch?.[0] || '' + + return { + content: imageUrl || content || 'Image generation completed', + outputType: 'image' + } + } } };