角色重绘复用角色提示词限定

角色图层重绘提交为角色生成类型
补充角色重绘请求契约测试
更新图片画布重绘链路文档
This commit is contained in:
2026-06-19 17:24:00 +08:00
parent aa67e72ec5
commit 05758775e8
3 changed files with 80 additions and 23 deletions
@@ -323,13 +323,15 @@ describe('useImageCanvasGenerationSubmissionWorkflow', () => {
'quick-edit:generating:closed:-:placeholder:-',
);
await waitFor(() => {
expect(generateEditorImageMock).toHaveBeenCalledWith({
prompt: '快速修图',
size: '1024x768',
kind: 'quick-edit',
model: 'gemini-3.1-flash-image-preview',
referenceImageSrcs: ['data:image/png;base64,source.png'],
});
expect(generateEditorImageMock).toHaveBeenCalledWith(
expect.objectContaining({
prompt: '快速修图',
size: '1024x768',
kind: 'quick-edit',
model: 'gemini-3.1-flash-image-preview',
referenceImageSrcs: ['data:image/png;base64,source.png'],
}),
);
});
await waitFor(() => {
expect(screen.getByTestId('layers').textContent).toContain(
@@ -368,6 +370,53 @@ describe('useImageCanvasGenerationSubmissionWorkflow', () => {
});
});
it('submits character redraws through the character image prompt contract', async () => {
generateEditorImageMock.mockResolvedValueOnce(
createGenerated({ prompt: '角色换成蓝色披风' }),
);
render(
<SubmissionWorkflowHarness
initialLayers={[
createLayer({
assetKind: 'character',
prompt: '原始角色设定',
}),
]}
initialQuickEditPanel={{
mode: 'redraw',
sourceLayerId: 'layer-source',
prompt: ' 角色换成蓝色披风 ',
size: '1024x768',
model: 'gpt-image-2',
status: 'idle',
}}
/>,
);
fireEvent.click(screen.getByRole('button', { name: '提交快速编辑' }));
await waitFor(() => {
expect(generateEditorImageMock).toHaveBeenCalledWith(
expect.objectContaining({
prompt: '角色换成蓝色披风',
size: '1024x768',
kind: 'character',
model: 'gpt-image-2',
referenceImageSrcs: ['data:image/png;base64,source.png'],
assetKind: 'character',
}),
);
});
await waitFor(() => {
expect(screen.getByTestId('layers').textContent).toContain(
'layer-quick-edit-1:源图 重绘:resource-source:character',
);
});
expect(screen.getByTestId('quick-edit').textContent).toBe(
'layer-source:idle:角色换成蓝色披风:-',
);
});
it('submits edit dialogs beside the source and clears the modal state', async () => {
editEditorImageMock.mockResolvedValueOnce(
createGenerated({ prompt: '修改当前图片' }),
@@ -390,10 +439,12 @@ describe('useImageCanvasGenerationSubmissionWorkflow', () => {
'edit:generating:open:-:-:-',
);
await waitFor(() => {
expect(editEditorImageMock).toHaveBeenCalledWith({
prompt: '修改当前图片',
sourceImageSrc: 'data:image/png;base64,source.png',
});
expect(editEditorImageMock).toHaveBeenCalledWith(
expect.objectContaining({
prompt: '修改当前图片',
sourceImageSrc: 'data:image/png;base64,source.png',
}),
);
});
await waitFor(() => {
expect(screen.getByTestId('layers').textContent).toContain(
@@ -492,13 +543,15 @@ describe('useImageCanvasGenerationSubmissionWorkflow', () => {
'publication:generating:closed:-:placeholder:-',
);
await waitFor(() => {
expect(generateEditorImageMock).toHaveBeenCalledWith({
prompt: expect.stringContaining('【宣发素材类型】详情页单图'),
size: '720x1280',
kind: 'publication-material',
model: 'gemini-3.1-flash-image-preview',
referenceImageSrcs: ['data:image/png;base64,large-ref'],
});
expect(generateEditorImageMock).toHaveBeenCalledWith(
expect.objectContaining({
prompt: expect.stringContaining('【宣发素材类型】详情页单图'),
size: '720x1280',
kind: 'publication-material',
model: 'gemini-3.1-flash-image-preview',
referenceImageSrcs: ['data:image/png;base64,large-ref'],
}),
);
});
const prompt = generateEditorImageMock.mock.calls[0]?.[0]?.prompt ?? '';
expect(prompt).toContain('游戏名:云朵消消乐');
@@ -707,9 +760,11 @@ describe('useImageCanvasGenerationSubmissionWorkflow', () => {
);
});
await waitFor(() => {
expect(extractEditorUiDesignAssetsMock).toHaveBeenCalledWith({
sourceImageSrc: 'data:image/png;base64,ui-design.png',
});
expect(extractEditorUiDesignAssetsMock).toHaveBeenCalledWith(
expect.objectContaining({
sourceImageSrc: 'data:image/png;base64,ui-design.png',
}),
);
});
await waitFor(() => {
expect(screen.getByTestId('layers').textContent).toContain(
@@ -697,10 +697,12 @@ export function useImageCanvasGenerationSubmissionWorkflow({
quickEditSourceLayer,
quickEditReferences,
);
const isCharacterRedraw =
panelMode === 'redraw' && quickEditSourceLayer.assetKind === 'character';
const generated = await generateEditorImage({
prompt: normalizedPrompt,
size: quickEditPanel.size,
kind: 'quick-edit',
kind: isCharacterRedraw ? 'character' : 'quick-edit',
model: normalizeEditorImageModel(quickEditPanel.model),
referenceImageSrcs: [
...extraReferenceImageSrcs,