58 lines
1.3 KiB
TypeScript
58 lines
1.3 KiB
TypeScript
export type PromptDefaultRole = {
|
|
name: string;
|
|
title: string;
|
|
role: string;
|
|
visualDescription?: string;
|
|
actionDescription?: string;
|
|
sceneVisualDescription?: string;
|
|
description?: string;
|
|
backstory?: string;
|
|
personality?: string;
|
|
motivation?: string;
|
|
combatStyle?: string;
|
|
tags?: string[];
|
|
};
|
|
|
|
export type CustomWorldRolePromptBundle = {
|
|
visualPromptText: string;
|
|
animationPromptText: string;
|
|
scenePromptText: string;
|
|
};
|
|
|
|
function cleanSeedText(value: string | undefined, maxLength: number) {
|
|
return (value ?? '').replace(/\s+/gu, ' ').trim().slice(0, maxLength);
|
|
}
|
|
|
|
function pickFirstDescription(
|
|
values: Array<string | undefined>,
|
|
maxLength: number,
|
|
) {
|
|
for (const value of values) {
|
|
const normalized = cleanSeedText(value, maxLength);
|
|
if (normalized) {
|
|
return normalized;
|
|
}
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
export function buildDefaultRolePromptBundle(
|
|
role: PromptDefaultRole,
|
|
): CustomWorldRolePromptBundle {
|
|
return {
|
|
visualPromptText: pickFirstDescription(
|
|
[role.visualDescription, role.description],
|
|
220,
|
|
),
|
|
animationPromptText: pickFirstDescription(
|
|
[role.actionDescription, role.combatStyle],
|
|
180,
|
|
),
|
|
scenePromptText: pickFirstDescription(
|
|
[role.sceneVisualDescription, role.backstory],
|
|
220,
|
|
),
|
|
};
|
|
}
|