| 242 | 242 | |
| 243 | 243 | // Format messages using instruct formatting |
| 244 | 244 | const formattedMessages = []; |
| 245 | + const prefillActive = prompt[prompt.length - 1].role === 'assistant'; |
| 245 | 246 | for (const message of prompt) { |
| 246 | 247 | let messageContent = message.content; |
| 247 | 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 | 259 | false, |
| 265 | 260 | undefined, |
| 266 | 261 | undefined, |
| 267 | 262 | undefined, |
| 268 | 263 | falseundefined, |
| 269 | | - false, |
| 270 | 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 | 299 | formattedMessages.push(messageContent); |
| 275 | 300 | } |