122 lines
3.8 KiB
TypeScript
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();
|
|
}
|