| 242 | | 242 | |
| 243 | // Format messages using instruct formatting | 243 | // Format messages using instruct formatting |
| 244 | const formattedMessages = []; | 244 | const formattedMessages = []; |
| | 245 | const prefillActive = prompt.length > 0 ? prompt[prompt.length - 1].role === 'assistant' : false; |
| 245 | for (const message of prompt) { | 246 | for (const message of prompt) { |
| 246 | let messageContent = message.content; | 247 | let messageContent = message.content; |
| 247 | if (!message.ignoreInstruct) { | 248 | if (!message.ignoreInstruct) { |
| 248 | messageContent = formatInstructModeChat( | 249 | const isLastMessage = message === prompt[prompt.length - 1]; |
| 249 | message.role, | 250 | |
| 250 | message.content, | 251 | // This complicated logic means: |
| 251 | message.role === 'user', | 252 | // 1. If prefill is not active, format all messages |
| 252 | false, | 253 | // 2. If prefill is active, format all messages except the last one |
| 253 | undefined, | 254 | if (!isLastMessage || !prefillActive) { |
| 254 | undefined, | 255 | messageContent = formatInstructModeChat( |
| 255 | undefined, | 256 | message.role, |
| 256 | undefined, | 257 | message.content, |
| 257 | instructPreset, | 258 | message.role === 'user', |
| 258 | ); | | |
| 259 | | | |
| 260 | // Add prompt formatting for the last message | | |
| 261 | if (message === prompt[prompt.length - 1]) { | | |
| 262 | messageContent += formatInstructModePrompt( | | |
| 263 | undefined, | | |
| 264 | false, | 259 | false, |
| 265 | undefined, | 260 | undefined, |
| 266 | undefined, | 261 | undefined, |
| 267 | undefined, | 262 | undefined, |
| 268 | false, | 263 | undefined, |
| 269 | false, | | |
| 270 | instructPreset, | 264 | instructPreset, |
| 271 | ); | 265 | ); |
| 272 | } | 266 | } |
| | 267 | |
| | 268 | // Add prompt formatting for the last message. |
| | 269 | if (isLastMessage) { |
| | 270 | if (!prefillActive) { // e.g. "<|im_start|>user:" |
| | 271 | messageContent += formatInstructModePrompt( |
| | 272 | undefined, |
| | 273 | false, |
| | 274 | undefined, |
| | 275 | undefined, |
| | 276 | undefined, |
| | 277 | false, |
| | 278 | false, |
| | 279 | instructPreset, |
| | 280 | ); |
| | 281 | } else { // e.g. "<|im_start|>assistant: Hello, my name is" |
| | 282 | const overridenInstructPreset = structuredClone(instructPreset); |
| | 283 | overridenInstructPreset.output_suffix = ''; |
| | 284 | overridenInstructPreset.wrap = false; |
| | 285 | messageContent = formatInstructModeChat( |
| | 286 | message.role, |
| | 287 | message.content, |
| | 288 | false, // since it is assistant |
| | 289 | false, |
| | 290 | undefined, |
| | 291 | undefined, |
| | 292 | undefined, |
| | 293 | undefined, |
| | 294 | overridenInstructPreset, |
| | 295 | ); |
| | 296 | } |
| | 297 | } |
| 273 | } | 298 | } |
| 274 | formattedMessages.push(messageContent); | 299 | formattedMessages.push(messageContent); |
| 275 | } | 300 | } |