107 lines
3.3 KiB
TypeScript
107 lines
3.3 KiB
TypeScript
|
|
/**
|
|||
|
|
* 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)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|