2024-01-03 22:16:50 -08:00
export function stringifyTurns ( turns ) {
let res = '' ;
for ( let turn of turns ) {
if ( turn . role === 'assistant' ) {
res += ` \n Your output: \n ${ turn . content } ` ;
} else if ( turn . role === 'system' ) {
res += ` \n System output: ${ turn . content } ` ;
} else {
res += ` \n User input: ${ turn . content } ` ;
}
}
return res . trim ( ) ;
2024-05-10 13:41:29 -05:00
}
export function toSinglePrompt ( turns , system = null , stop _seq = '***' , model _nickname = 'assistant' ) {
2024-05-14 21:34:14 -05:00
let prompt = system ? ` ${ system } ${ stop _seq } ` : '' ;
let role = '' ;
turns . forEach ( ( message ) => {
2024-05-10 13:41:29 -05:00
role = message . role ;
if ( role === 'assistant' ) role = model _nickname ;
prompt += ` ${ role } : ${ message . content } ${ stop _seq } ` ;
} ) ;
if ( role !== model _nickname ) // if the last message was from the user/system, add a prompt for the model. otherwise, pretend we are extending the model's own message
prompt += model _nickname + ": " ;
return prompt ;
2024-06-01 15:03:45 -05:00
}
2025-02-04 14:41:57 -06:00
// ensures stricter turn order and roles:
// - system messages are treated as user messages and prefixed with SYSTEM:
// - combines repeated messages from users
// - separates repeat assistant messages with filler user messages
2024-06-01 15:03:45 -05:00
export function strictFormat ( turns ) {
let prev _role = null ;
let messages = [ ] ;
let filler = { role : 'user' , content : '_' } ;
for ( let msg of turns ) {
2025-01-24 16:29:03 +09:00
if ( typeof msg . content === 'string' ) {
msg . content = msg . content . trim ( ) ;
}
2024-06-01 15:03:45 -05:00
if ( msg . role === 'system' ) {
msg . role = 'user' ;
msg . content = 'SYSTEM: ' + msg . content ;
}
if ( msg . role === prev _role && msg . role === 'assistant' ) {
// insert empty user message to separate assistant messages
messages . push ( filler ) ;
messages . push ( msg ) ;
}
else if ( msg . role === prev _role ) {
// combine new message with previous message instead of adding a new one
messages [ messages . length - 1 ] . content += '\n' + msg . content ;
}
else {
messages . push ( msg ) ;
}
prev _role = msg . role ;
}
if ( messages . length > 0 && messages [ 0 ] . role !== 'user' ) {
messages . unshift ( filler ) ; // anthropic requires user message to start
}
if ( messages . length === 0 ) {
messages . push ( filler ) ;
}
return messages ;
2024-01-03 22:16:50 -08:00
}