/** * AI 圖像生成 Composable * 用於生成人物三視圖和場景圖片 */ import { useAIProvider } from './useAIProvider' import { getImageGenerationModel } from '~/utils/storage' import { DEFAULT_IMAGE_GENERATION_MODEL } from '~/utils/clients/gemini-models' import { getModelProvider } from '~/utils/clients/all-models' export function useAIImageGeneration() { const isLoading = ref(false) const error = ref(null) /** * 生成圖像 * 注意:目前 Gemini 和 Grok 的圖像生成 API 可能需要不同的實現 * 這裡先提供一個基礎框架,實際 API 調用需要根據各 provider 的文檔調整 */ async function generateImage(prompt: string): Promise { isLoading.value = true error.value = null try { const modelName = getImageGenerationModel() || DEFAULT_IMAGE_GENERATION_MODEL const provider = useAIProvider(modelName) const providerType = getModelProvider(modelName) // 根據不同的 provider 使用不同的圖像生成方式 // 目前 Gemini 和 Grok 可能沒有直接的圖像生成 API // 這裡使用文字生成模型來生成圖像描述的 prompt,然後由前端處理 // 實際應用中,可能需要整合專門的圖像生成服務(如 DALL-E, Midjourney 等) // 暫時返回一個提示,說明需要整合圖像生成服務 // 實際實作時,這裡應該調用圖像生成 API throw new Error('圖像生成功能需要整合專門的圖像生成服務。目前可以使用文字模型生成圖像描述,然後手動生成圖像。') } catch (err) { const errorMessage = err instanceof Error ? err.message : '未知錯誤' error.value = errorMessage throw err } finally { isLoading.value = false } } /** * 生成人物三視圖 */ async function generateCharacterView( characterName: string, characterDescription: string, view: 'front' | 'side' | 'back', style?: string ): Promise { const viewNames = { front: '正面', side: '側面', back: '背面' } const prompt = `請生成一個${viewNames[view]}視圖的人物圖片,要求: - 角色名稱:${characterName} - 角色描述:${characterDescription} - 視圖角度:${viewNames[view]} - 背景:純白色 - 風格:${style || '寫實風格'} - 圖片格式:PNG,透明背景或白色背景 - 解析度:512x512 或更高 請確保圖片清晰,角色特徵明顯。` // 目前返回提示文字,實際應該返回圖像 URL 或 base64 // 這裡可以整合實際的圖像生成 API return await generateImage(prompt) } /** * 生成場景圖片 */ async function generateSceneImage( sceneName: string, sceneDescription: string, style?: string ): Promise { const prompt = `請生成一個場景圖片,要求: - 場景名稱:${sceneName} - 場景描述:${sceneDescription} - 背景:純白色或透明 - 風格:${style || '寫實風格'} - 圖片格式:PNG - 解析度:1024x1024 或更高 請確保場景清晰,細節豐富。` return await generateImage(prompt) } return { generateImage, generateCharacterView, generateSceneImage, isLoading: readonly(isLoading), error: readonly(error) } }