/** * 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(); }