ai-cut/app/composables/useAIImageGeneration.ts

107 lines
3.3 KiB
TypeScript
Raw Normal View History

2025-12-16 10:08:51 +00:00
/**
* 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<string | null>(null)
/**
*
* Gemini Grok API
* API 調 provider 調
*/
async function generateImage(prompt: string): Promise<string> {
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<string> {
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<string> {
const prompt = `請生成一個場景圖片,要求:
- ${sceneName}
- ${sceneDescription}
-
- ${style || '寫實風格'}
- PNG
- 1024x1024
`
return await generateImage(prompt)
}
return {
generateImage,
generateCharacterView,
generateSceneImage,
isLoading: readonly(isLoading),
error: readonly(error)
}
}