重构图标规范与图集生成链路
新增图标规范独立队列任务并将参数补全纳入统一计费操作 将图标图集生成和手工拆分迁入独立图标模块并复用公共生图能力 将图标规范引用收紧为项目资源或素材 ID 同步 SpacetimeDB 引用解析契约、External OpenAPI、前端与 Agent 提交链路 补充相关回归测试和长期架构约定
This commit is contained in:
@@ -900,7 +900,7 @@ describe('editorProjectClient', () => {
|
||||
).rejects.toThrow('生成参考图最多允许 5 张');
|
||||
await expect(
|
||||
generateEditorIconSpritesheet({
|
||||
referenceImageSrc: '/generated-images/editor/spec.png',
|
||||
referenceId: 'editor-resource-spec',
|
||||
referenceImageSrcs: references.slice(0, 5),
|
||||
iconDescriptions: ['返回按钮'],
|
||||
model: 'gpt-image-2',
|
||||
@@ -935,7 +935,7 @@ describe('editorProjectClient', () => {
|
||||
);
|
||||
|
||||
await generateEditorIconSpritesheet({
|
||||
referenceImageSrc: '/generated-images/editor/icon-spec.png',
|
||||
referenceId: 'editor-resource-icon-spec',
|
||||
referenceImageSrcs: references,
|
||||
iconDescriptions: ['返回按钮'],
|
||||
});
|
||||
@@ -1118,7 +1118,7 @@ describe('editorProjectClient', () => {
|
||||
});
|
||||
|
||||
const result = await generateEditorIconSpritesheet({
|
||||
referenceImageSrc: '/generated-images/editor/spec.png',
|
||||
referenceId: 'editor-resource-spec',
|
||||
referenceImageSrcs: ['/generated-images/editor/icon-ref.png'],
|
||||
iconDescriptions: ['返回按钮', '设置按钮'],
|
||||
assetLabel: '冒险游戏图标',
|
||||
@@ -1135,7 +1135,7 @@ describe('editorProjectClient', () => {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
referenceImageSrc: '/generated-images/editor/spec.png',
|
||||
referenceId: 'editor-resource-spec',
|
||||
referenceImageSrcs: ['/generated-images/editor/icon-ref.png'],
|
||||
iconDescriptions: ['返回按钮', '设置按钮'],
|
||||
model: 'gemini-3.1-flash-image-preview',
|
||||
@@ -1164,7 +1164,7 @@ describe('editorProjectClient', () => {
|
||||
});
|
||||
|
||||
await generateEditorIconSpritesheet({
|
||||
referenceImageSrc: '/generated-images/editor/spec.png',
|
||||
referenceId: 'editor-resource-spec',
|
||||
iconDescriptions: ['返回按钮'],
|
||||
model: 'gpt-image-2',
|
||||
screenColor: '#E6D8FF',
|
||||
@@ -1186,7 +1186,7 @@ describe('editorProjectClient', () => {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
referenceImageSrc: '/generated-images/editor/spec.png',
|
||||
referenceId: 'editor-resource-spec',
|
||||
iconDescriptions: ['返回按钮'],
|
||||
model: 'gpt-image-2',
|
||||
screenColor: '#E6D8FF',
|
||||
@@ -1452,20 +1452,6 @@ describe('editorProjectClient', () => {
|
||||
expect(requestJsonMock).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('rejects excess icon spec references before dispatch', async () => {
|
||||
await expect(
|
||||
generateEditorIconSpec({
|
||||
playSetting: '回合制占点',
|
||||
artStyle: '低多边形',
|
||||
referenceImageSrcs: Array.from(
|
||||
{ length: 6 },
|
||||
(_, index) => `resource-reference-${index + 1}`,
|
||||
),
|
||||
}),
|
||||
).rejects.toThrow('图标规范参考图最多允许 5 张,当前选择 6 张');
|
||||
expect(requestJsonMock).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it('submits icon spec business fields without a client prompt or image kind', async () => {
|
||||
requestJsonMock.mockResolvedValueOnce({
|
||||
imageSrc: 'data:image/png;base64,spec',
|
||||
@@ -1476,7 +1462,7 @@ describe('editorProjectClient', () => {
|
||||
await generateEditorIconSpec({
|
||||
playSetting: '回合制占点',
|
||||
artStyle: '低多边形',
|
||||
referenceImageSrcs: ['resource-reference-1'],
|
||||
referenceId: 'resource-reference-1',
|
||||
projectId: 'editor-project-1',
|
||||
generationInputs: {
|
||||
fields: [],
|
||||
@@ -1498,7 +1484,7 @@ describe('editorProjectClient', () => {
|
||||
expect(body).toEqual({
|
||||
playSetting: '回合制占点',
|
||||
artStyle: '低多边形',
|
||||
referenceImageSrcs: ['resource-reference-1'],
|
||||
referenceId: 'resource-reference-1',
|
||||
projectId: 'editor-project-1',
|
||||
generationInputs: {
|
||||
fields: [],
|
||||
|
||||
@@ -258,7 +258,7 @@ export type EditorImageGenerationInput = {
|
||||
export type EditorIconSpecGenerationInput = {
|
||||
playSetting: string;
|
||||
artStyle: string;
|
||||
referenceImageSrcs?: string[];
|
||||
referenceId?: string;
|
||||
projectId?: string | null;
|
||||
generationInputs?: EditorAssetGenerationInputs | null;
|
||||
assetFolderId?: string | null;
|
||||
@@ -281,7 +281,7 @@ export type EditorCanvasGenerationCompletionInput = {
|
||||
};
|
||||
|
||||
export type EditorIconSpritesheetGenerationInput = {
|
||||
referenceImageSrc: string;
|
||||
referenceId: string;
|
||||
referenceImageSrcs?: string[];
|
||||
iconDescriptions: string[];
|
||||
model?: string;
|
||||
@@ -1105,20 +1105,12 @@ export async function generateEditorIconSpec(
|
||||
input.artStyle,
|
||||
'美术风格',
|
||||
);
|
||||
assertStableEditorMediaReferences(input.referenceImageSrcs, '图标规范参考图');
|
||||
assertEditorReferenceLimit(
|
||||
input.referenceImageSrcs,
|
||||
EDITOR_IMAGE_REFERENCE_LIMIT,
|
||||
'图标规范参考图',
|
||||
);
|
||||
return requestJson<EditorImageGenerationResponse>(
|
||||
EDITOR_ICON_SPEC_GENERATION_API,
|
||||
jsonRequest('POST', {
|
||||
playSetting,
|
||||
artStyle,
|
||||
...(input.referenceImageSrcs?.length
|
||||
? { referenceImageSrcs: input.referenceImageSrcs }
|
||||
: {}),
|
||||
...(input.referenceId ? { referenceId: input.referenceId } : {}),
|
||||
...(input.projectId ? { projectId: input.projectId } : {}),
|
||||
...(input.generationInputs
|
||||
? { generationInputs: input.generationInputs }
|
||||
@@ -1143,7 +1135,6 @@ export async function generateEditorIconSpritesheet(
|
||||
input: EditorIconSpritesheetGenerationInput,
|
||||
) {
|
||||
const model = input.model?.trim() || EDITOR_IMAGE_MODEL_NANOBANANA2;
|
||||
assertStableEditorMediaReference(input.referenceImageSrc, '图标素材规范');
|
||||
assertStableEditorMediaReferences(input.referenceImageSrcs, '图标素材参考图');
|
||||
assertEditorReferenceLimit(
|
||||
input.referenceImageSrcs,
|
||||
@@ -1156,7 +1147,7 @@ export async function generateEditorIconSpritesheet(
|
||||
return requestJson<EditorIconSpritesheetGenerationResponse>(
|
||||
EDITOR_ICON_SPRITESHEET_GENERATION_API,
|
||||
jsonRequest('POST', {
|
||||
referenceImageSrc: input.referenceImageSrc,
|
||||
referenceId: input.referenceId,
|
||||
...(input.referenceImageSrcs?.length
|
||||
? { referenceImageSrcs: input.referenceImageSrcs }
|
||||
: {}),
|
||||
|
||||
Reference in New Issue
Block a user