fix(compaction): adjust instructions and structure to be more clear to smaller models like dsv4 flash (#42045)
Co-authored-by: akenra <37288280+akenra@users.noreply.github.com>
This commit is contained in:
@@ -44,6 +44,15 @@ Rules:
|
||||
- Use terse bullets, not prose paragraphs.
|
||||
- Preserve exact file paths, symbols, commands, error strings, URLs, and identifiers when known.
|
||||
- Do not mention the summary process or that context was compacted.`
|
||||
const SUMMARY_UPDATE_INSTRUCTIONS = `The <prior-summary> summarizes everything that happened before the <conversation>. Construct a new summary that combines both. The <prior-summary> is discarded after this: anything you do not carry into the new summary is lost.
|
||||
|
||||
When combining:
|
||||
- Carry forward objectives, constraints, user directives, decisions, and parallel workstreams from the <prior-summary> even when the <conversation> does not mention them. Drop only what is finished and no longer needed.
|
||||
- The <conversation> is more recent than the <prior-summary>. Where they conflict, the conversation wins: state the corrected fact and drop the old claim.
|
||||
- Add new progress, decisions, constraints, and context from the conversation.
|
||||
- Move completed work from "Active" to "Completed".
|
||||
- If a blocker has been resolved, update the summary to reflect that while keeping any details still needed to continue the work.
|
||||
- Update "Objective" and "Next Move" to reflect the current work state.`
|
||||
|
||||
type Entry = {
|
||||
readonly seq: number
|
||||
@@ -136,36 +145,33 @@ const select = (
|
||||
if (conversation.length === 0) return
|
||||
let total = 0
|
||||
let split = conversation.length
|
||||
let splitPrefix = ""
|
||||
let splitSuffix = ""
|
||||
for (let index = conversation.length - 1; index >= 0; index--) {
|
||||
const next = total + Token.estimate(conversation[index])
|
||||
if (next > tokens) {
|
||||
const remaining = Math.max(0, tokens - total) * 4
|
||||
if (remaining > 0) {
|
||||
splitPrefix = conversation[index].slice(0, -remaining)
|
||||
splitSuffix = conversation[index].slice(-remaining)
|
||||
split = index + 1
|
||||
}
|
||||
break
|
||||
}
|
||||
if (next > tokens) break
|
||||
total = next
|
||||
split = index
|
||||
}
|
||||
return {
|
||||
head: [...conversation.slice(0, split), splitPrefix].filter(Boolean).join("\n\n"),
|
||||
recent: [splitSuffix, ...conversation.slice(split)].filter(Boolean).join("\n\n"),
|
||||
head: conversation.slice(0, split).join("\n\n"),
|
||||
recent: conversation.slice(split).join("\n\n"),
|
||||
}
|
||||
}
|
||||
|
||||
export const buildPrompt = (input: { readonly previousSummary?: string; readonly context: readonly string[] }) =>
|
||||
[
|
||||
input.previousSummary
|
||||
? `Update the anchored summary below using the conversation history above.\nPreserve still-true details, remove stale details, and merge in the new facts.\n<previous-summary>\n${input.previousSummary}\n</previous-summary>`
|
||||
: "Create a new anchored summary from the conversation history.",
|
||||
export const buildPrompt = (input: { readonly previousSummary?: string; readonly context: readonly string[] }) => {
|
||||
const conversation = `Here is the conversation so far:\n\n<conversation>\n${input.context.join("\n\n")}\n</conversation>`
|
||||
if (!input.previousSummary)
|
||||
return [
|
||||
conversation,
|
||||
"Create a new anchored summary from the conversation history in the <conversation> tags above so another coding agent can continue the work.",
|
||||
SUMMARY_TEMPLATE,
|
||||
].join("\n\n")
|
||||
return [
|
||||
conversation,
|
||||
`Here is the summary of the conversation before the <conversation> above:\n\n<prior-summary>\n${input.previousSummary}\n</prior-summary>`,
|
||||
SUMMARY_UPDATE_INSTRUCTIONS,
|
||||
SUMMARY_TEMPLATE,
|
||||
...input.context,
|
||||
].join("\n\n")
|
||||
}
|
||||
|
||||
export const make = (dependencies: Dependencies) => {
|
||||
const config = settings(dependencies.config)
|
||||
|
||||
Reference in New Issue
Block a user