import { genPrompt } from '@opentiny/genui-sdk-core';
import { materialsMeta } from '@opentiny/genui-sdk-materials-vue-opentiny-vue/meta';
import { materialsMeta as ngMaterialsMeta } from '@opentiny/genui-sdk-materials-angular-opentiny-ng/meta';
import { IChatCompletionCreateParams, ChatCompletionCreateParamsBase, type IGenPromptConfig } from './types';
function mergePrompt(
initialPrompt: string,
additionalPrompt: string,
strategy: IGenPromptConfig['strategy'] = 'append'
): string {
if (strategy === 'override') {
return additionalPrompt;
}
if (strategy === 'prepend') {
return additionalPrompt + '\n' + initialPrompt;
}
return initialPrompt + '\n' + additionalPrompt;
}
export function requestTransform(
params: IChatCompletionCreateParams
): ChatCompletionCreateParamsBase {
const newParams = structuredClone(params);
const { tinygenui: customConfigString = '{}' as JsonSerialized<IGenPromptConfig> } = newParams.metadata || {};
let tgCustomConfig: IGenPromptConfig;
try {
tgCustomConfig = JSON.parse<IGenPromptConfig>(customConfigString);
} catch (error) {
console.error('parse tgCustomConfig failed', error);
throw error;
}
delete newParams.metadata?.tinygenui;
const { framework = 'Vue', strategy = 'append', ...promptConfig } = tgCustomConfig;
const renderConfigForFramework = framework === 'Angular' ? ngMaterialsMeta : materialsMeta;
const systemMessages = newParams.messages?.find((message) => message.role === 'system');
const prompt = genPrompt(framework, renderConfigForFramework, promptConfig);
if (systemMessages) {
systemMessages.content = mergePrompt(systemMessages.content as string, prompt, strategy);
} else {
newParams.messages?.unshift({ role: 'system', content: prompt });
}
return newParams;
}