This commit is contained in:
2026-05-05 14:40:41 +08:00
parent e847fcea6f
commit 07e777fef8
76 changed files with 4246 additions and 444 deletions

View File

@@ -7,6 +7,7 @@ const { requestJsonMock } = vi.hoisted(() => ({
}));
import {
generateRpgWorldOpeningCg,
generateRpgWorldLandmark,
generateRpgWorldSceneImage,
generateRpgWorldSceneNpc,
@@ -23,6 +24,11 @@ describe('rpgCreationAssetClient', () => {
entity: { id: 'landmark-1', name: '雾港' },
imageSrc: '/generated-custom-world-scenes/profile/scene/image.webp',
npc: { id: 'npc-1', name: '守灯人' },
openingCg: {
id: 'opening-cg-1',
status: 'ready',
videoSrc: '/generated-custom-world-scenes/profile/opening.mp4',
},
});
});
@@ -89,4 +95,24 @@ describe('rpgCreationAssetClient', () => {
'生成场景 NPC 失败',
);
});
it('posts opening cg generation to the runtime custom world asset route', async () => {
const openingCg = await generateRpgWorldOpeningCg({
profile: {
id: 'profile-1',
name: '雾海群岛',
} as never,
});
expect(openingCg.videoSrc).toBe(
'/generated-custom-world-scenes/profile/opening.mp4',
);
expect(requestJsonMock).toHaveBeenCalledWith(
'/api/runtime/custom-world/opening-cg',
expect.objectContaining({
method: 'POST',
}),
'生成开局 CG 失败',
);
});
});

View File

@@ -2,6 +2,7 @@ import { ASSET_API_PATHS } from '../../editor/shared/editorApiClient';
import type {
CustomWorldLandmark,
CustomWorldNpc,
CustomWorldOpeningCgProfile,
CustomWorldPlayableNpc,
CustomWorldProfile,
} from '../../types';
@@ -132,6 +133,20 @@ export async function generateRpgWorldLandmark(payload: {
return response.entity;
}
export async function generateRpgWorldOpeningCg(payload: {
profile: CustomWorldProfile;
}) {
const response = await requestRpgCreationPostJson<{
openingCg: CustomWorldOpeningCgProfile;
}>(
`${RPG_CREATION_ASSET_API_BASE}/opening-cg`,
payload,
'生成开局 CG 失败',
);
return response.openingCg;
}
/**
* 工作包 D 把结果页与编辑器依赖的资产请求迁入 RPG 创作域 client
* 保留封面资产服务的既有边界,不把逻辑重新塞回 `aiService.ts`。
@@ -143,6 +158,7 @@ export const rpgCreationAssetClient = {
generatePlayableNpc: generateRpgWorldPlayableNpc,
generateStoryNpc: generateRpgWorldStoryNpc,
generateLandmark: generateRpgWorldLandmark,
generateOpeningCg: generateRpgWorldOpeningCg,
generateCoverImage: generateCustomWorldCoverImage,
uploadCoverImage: uploadCustomWorldCoverImage,
};