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