Fix prop confirmation bug, add Wan 2.7 model, refine multiple UI details, improve prop generation quality and aspect ratio, remove text overlays from Asset Center created images, and optimize prop filtering logic

This commit is contained in:
saturn
2026-04-03 22:36:41 +08:00
parent 854b932e67
commit 78b93331b4
136 changed files with 3393 additions and 875 deletions

View File

@@ -25,8 +25,9 @@ const prismaMock = vi.hoisted(() => ({
}))
const sharedMock = vi.hoisted(() => ({
generateLabeledImageToCos: vi.fn<(input: {
generateProjectLabeledImageToStorage: vi.fn<(input: {
prompt: string
label: string
options?: { referenceImages?: string[]; aspectRatio?: string }
}) => Promise<string>>(async () => 'cos/character-generated-0.png'),
}))
@@ -41,7 +42,7 @@ vi.mock('@/lib/workers/handlers/image-task-handler-shared', async () => {
)
return {
...actual,
generateLabeledImageToCos: sharedMock.generateLabeledImageToCos,
generateProjectLabeledImageToStorage: sharedMock.generateProjectLabeledImageToStorage,
}
})
@@ -101,8 +102,9 @@ describe('worker character-image-task-handler behavior', () => {
imageUrl: 'cos/character-generated-0.png',
})
const generationInput = sharedMock.generateLabeledImageToCos.mock.calls[0]?.[0] as {
const generationInput = sharedMock.generateProjectLabeledImageToStorage.mock.calls[0]?.[0] as {
prompt: string
label: string
options?: { referenceImages?: string[]; aspectRatio?: string }
}
const realisticStylePrompt = getArtStylePrompt('realistic', 'zh')
@@ -111,6 +113,7 @@ describe('worker character-image-task-handler behavior', () => {
expect(generationInput.prompt).toContain(realisticStylePrompt)
expect(generationInput.prompt.split(CHARACTER_PROMPT_SUFFIX).length - 1).toBe(1)
expect(generationInput.prompt.split(realisticStylePrompt).length - 1).toBe(1)
expect(generationInput.label).toBe('Hero - 战斗形态')
expect(generationInput.options).toEqual(expect.objectContaining({
referenceImages: ['normalized-primary-ref'],
aspectRatio: '3:2',
@@ -129,7 +132,7 @@ describe('worker character-image-task-handler behavior', () => {
const job = buildJob({ imageIndex: 0, artStyle: 'japanese-anime' })
await handleCharacterImageTask(job)
const generationInput = sharedMock.generateLabeledImageToCos.mock.calls[0]?.[0] as {
const generationInput = sharedMock.generateProjectLabeledImageToStorage.mock.calls[0]?.[0] as {
prompt: string
}
expect(generationInput.prompt).toContain(getArtStylePrompt('japanese-anime', 'zh'))
@@ -143,7 +146,7 @@ describe('worker character-image-task-handler behavior', () => {
})
it('uses requested count for grouped generation and expands imageUrls to requested size', async () => {
sharedMock.generateLabeledImageToCos
sharedMock.generateProjectLabeledImageToStorage
.mockResolvedValueOnce('cos/character-generated-0.png')
.mockResolvedValueOnce('cos/character-generated-1.png')
.mockResolvedValueOnce('cos/character-generated-2.png')
@@ -152,7 +155,7 @@ describe('worker character-image-task-handler behavior', () => {
const result = await handleCharacterImageTask(buildJob({ count: 5 }))
expect(sharedMock.generateLabeledImageToCos).toHaveBeenCalledTimes(5)
expect(sharedMock.generateProjectLabeledImageToStorage).toHaveBeenCalledTimes(5)
expect(result).toEqual({
appearanceId: 'appearance-2',
imageCount: 5,