Skip to content

Commit 5166df3

Browse files
committed
refactor: inject context as text part in existing user message
1 parent 1d93287 commit 5166df3

File tree

2 files changed

+21
-4
lines changed

2 files changed

+21
-4
lines changed

lib/messages/inject.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { renderNudge } from "../prompts"
66
import {
77
extractParameterKey,
88
buildToolIdList,
9-
createSyntheticUserMessage,
9+
createSyntheticTextPart,
1010
createSyntheticToolPart,
1111
isIgnoredUserMessage,
1212
} from "./utils"
@@ -182,18 +182,22 @@ export const insertPruneToolContext = (
182182
}
183183

184184
const userInfo = lastUserMessage.info as UserMessage
185-
const variant = state.variant ?? userInfo.variant
186185

187186
const lastNonIgnoredMessage = messages.findLast(
188187
(msg) => !(msg.info.role === "user" && isIgnoredUserMessage(msg)),
189188
)
190189

190+
if (!lastNonIgnoredMessage) {
191+
return
192+
}
193+
191194
// It's not safe to inject assistant role messages following a user message as models such
192195
// as Claude expect the assistant "turn" to start with reasoning parts. Reasoning parts in many
193196
// cases also cannot be faked as they may be encrypted by the model.
194197
// Gemini only accepts synth reasoning text if it is "skip_thought_signature_validator"
195-
if (!lastNonIgnoredMessage || lastNonIgnoredMessage.info.role === "user") {
196-
messages.push(createSyntheticUserMessage(lastUserMessage, combinedContent, variant))
198+
if (lastNonIgnoredMessage.info.role === "user") {
199+
const textPart = createSyntheticTextPart(lastNonIgnoredMessage, combinedContent)
200+
lastNonIgnoredMessage.parts.push(textPart)
197201
} else {
198202
// Append tool part to existing assistant message. This approach works universally across
199203
// models including DeepSeek and Kimi which don't output reasoning parts following an

lib/messages/utils.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,19 @@ export const createSyntheticUserMessage = (
4545
}
4646
}
4747

48+
export const createSyntheticTextPart = (baseMessage: WithParts, content: string) => {
49+
const userInfo = baseMessage.info as UserMessage
50+
const partId = generateUniqueId("prt")
51+
52+
return {
53+
id: partId,
54+
sessionID: userInfo.sessionID,
55+
messageID: baseMessage.info.id,
56+
type: "text" as const,
57+
text: content,
58+
}
59+
}
60+
4861
export const createSyntheticToolPart = (
4962
baseMessage: WithParts,
5063
content: string,

0 commit comments

Comments
 (0)