ai-cut/app/composables/useAIImageGeneration.ts

107 lines
3.3 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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)
}
}