Files
sillytavern-repalice/server/src/modules/examples/adapter-examples.ts

122 lines
3.8 KiB
TypeScript

/**
* Adapter Usage Examples
* Demonstrates how to use the adapters for import/export
*/
import { ChatAdapter } from '../chat/adapters/chat.adapter';
import { WorldInfoAdapter } from '../world-info/adapters/world-info.adapter';
import { PresetAdapter } from '../preset/adapters/preset.adapter';
// ============================================
// Example 1: Chat Import/Export
// ============================================
export function chatExample() {
const adapter = new ChatAdapter();
// Sample SillyTavern JSONL content
const jsonlContent = `{"user_name":"User","character_name":"Assistant","create_date":"2024-01-01T12:00:00.000Z"}
{"name":"User","is_user":true,"send_date":1704115200000,"mes":"你好!"}
{"name":"Assistant","is_user":false,"send_date":1704115210000,"mes":"你好!有什么可以帮助你的吗?"}`;
// Import from ST format
const internalChat = adapter.importFromST(jsonlContent);
console.log('Imported chat:', internalChat.metadata.characterName);
console.log('Message count:', internalChat.messages.length);
// Export back to ST format
const exportedJsonl = adapter.exportToST(internalChat);
console.log('Exported JSONL length:', exportedJsonl.length);
}
// ============================================
// Example 2: World Info with Unified Triggers
// ============================================
export function worldInfoExample() {
const adapter = new WorldInfoAdapter();
// Sample ST World Info
const stWorldInfo = {
name: '奇幻世界',
description: '一个魔法世界',
entries: [
{
key: ['魔法', '法术'],
content: '这个世界充满了魔法能量。',
constant: false,
selective: false,
order: 1,
position: 'after_char' as const,
use_regex: false,
enabled: true,
},
{
key: [],
content: '这是一个永恒的背景设定。',
constant: true, // Permanent trigger
selective: false,
order: 0,
position: 'before_char' as const,
use_regex: false,
enabled: true,
},
],
};
// Import from ST format (converts to unified triggers)
const extendedWorldInfo = adapter.importFromST(stWorldInfo);
console.log('World Info:', extendedWorldInfo.name);
console.log('Entry 1 triggers:', extendedWorldInfo.entries[0].triggers);
// Export back to ST format (converts triggers back to keys + constant)
const exportedST = adapter.exportToST(extendedWorldInfo);
console.log('Exported entries:', exportedST.entries.length);
}
// ============================================
// Example 3: Preset with Position Anchors
// ============================================
export function presetExample() {
const adapter = new PresetAdapter();
// Sample ST Preset
const stPreset = {
name: '创意写作预设',
temp: 0.9,
top_p: 0.95,
top_k: 50,
rep_pen: 1.05,
maxContextTokens: 8192,
streaming: true,
description: '用于创意写作的预设配置',
};
// Import from ST format
const extendedPreset = adapter.importFromST(stPreset);
console.log('Preset:', extendedPreset.name);
console.log('Temperature:', extendedPreset.temperature);
console.log('Entries count:', extendedPreset.entries.length);
console.log('Entry positions:', extendedPreset.entries.map((e) => e.position));
// Export back to ST format
const exportedST = adapter.exportToST(extendedPreset);
console.log('Exported preset:', exportedST.name);
}
// ============================================
// Run examples
// ============================================
if (require.main === module) {
console.log('=== Chat Example ===');
chatExample();
console.log('\n=== World Info Example ===');
worldInfoExample();
console.log('\n=== Preset Example ===');
presetExample();
}