Files
Genarrative/src/components/rpg-creation-asset-studio/useRoleVisualCandidateWorkflow.ts
2026-04-21 18:27:46 +08:00

60 lines
1.7 KiB
TypeScript

import { generateCharacterVisualCandidates } from '../asset-studio/characterAssetWorkflowPersistence';
import type { CharacterVisualDraft } from '../asset-studio/characterAssetWorkflowPersistence';
import { roleAssetStudioPublishClient } from './roleAssetStudioPublishClient';
import type { EditableCustomWorldRole } from './roleAssetStudioModel';
export function useRoleVisualCandidateWorkflow() {
const generateVisualCandidatesForRole = async (params: {
characterBriefText: string;
promptText: string;
referenceImageDataUrls: string[];
role: EditableCustomWorldRole;
sourceMode: 'text-to-image' | 'image-to-image';
}) => {
const {
characterBriefText,
promptText,
referenceImageDataUrls,
role,
sourceMode,
} = params;
return generateCharacterVisualCandidates({
characterId: role.id,
sourceMode,
promptText,
characterBriefText,
referenceImageDataUrls,
candidateCount: 1,
imageModel: 'wan2.7-image-pro',
size: '1024*1024',
});
};
const applyVisualDraftToRole = async (params: {
draft: CharacterVisualDraft;
promptText: string;
role: EditableCustomWorldRole;
sourceMode: 'text-to-image' | 'image-to-image';
}) => {
const { draft, promptText, role, sourceMode } = params;
return roleAssetStudioPublishClient.publishCharacterVisualAsset({
characterId: role.id,
sourceMode,
promptText,
selectedPreviewSource: draft.imageSrc,
previewSources: [draft.imageSrc],
width: draft.width,
height: draft.height,
updateCharacterOverride: false,
});
};
return {
applyVisualDraftToRole,
generateVisualCandidatesForRole,
};
}