Vendored
+27
-11
@@ -72,6 +72,22 @@ function loadedCtxSize() {
|
||||
return (loaded && loaded.ctxSize) || 8192;
|
||||
}
|
||||
|
||||
function systemTokens(history) {
|
||||
if (history && history[0] && history[0].role === 'system') return compaction.conversationTokens([history[0]]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
function historyCompactOpts(session, toolDefs, ctxSize, sidecarTokens, budget, attempt) {
|
||||
return {
|
||||
budgetTokens: compaction.historyBudget(ctxSize, toolDefs, attempt || 0, sidecarTokens, {
|
||||
voice: !!budget.voice,
|
||||
systemTokens: systemTokens(session.history),
|
||||
}),
|
||||
tools: toolDefs,
|
||||
voice: !!budget.voice,
|
||||
};
|
||||
}
|
||||
|
||||
function toolResultCap(budget) {
|
||||
const ctx = loadedCtxSize();
|
||||
const voice = !!(budget && budget.voice);
|
||||
@@ -608,22 +624,20 @@ async function runTurn(ctx) {
|
||||
const sidecarTokens = compaction.conversationTokens(turnSidecars) + 256;
|
||||
const beforeUsage = compaction.usage(session.history, toolDefs, ctxSize);
|
||||
emitLive(emit, session.id, jobId, Object.assign({ type: 'context' }, beforeUsage));
|
||||
if (compaction.shouldCompact(session.history, toolDefs, ctxSize, sidecarTokens)) {
|
||||
if (compaction.shouldCompact(session.history, toolDefs, ctxSize, sidecarTokens, { voice: !!budget.voice })) {
|
||||
emitUpdate(emit, session.id, jobId, {
|
||||
type: 'compaction',
|
||||
status: 'start',
|
||||
method: 'llm',
|
||||
method: budget.voice ? 'heuristic' : 'llm',
|
||||
used: beforeUsage.used,
|
||||
limit: beforeUsage.limit,
|
||||
pct: beforeUsage.pct,
|
||||
threshold: beforeUsage.threshold,
|
||||
});
|
||||
const compactOpts = {
|
||||
budgetTokens: compaction.historyBudget(ctxSize, toolDefs, 0, sidecarTokens),
|
||||
tools: toolDefs,
|
||||
voice: !!budget.voice,
|
||||
};
|
||||
session.history = await compaction.compactWithLlm(session.history, Object.assign({}, compactOpts, {
|
||||
const compactOpts = historyCompactOpts(session, toolDefs, ctxSize, sidecarTokens, budget, 0);
|
||||
session.history = budget.voice
|
||||
? compaction.compact(session.history, compactOpts)
|
||||
: await compaction.compactWithLlm(session.history, Object.assign({}, compactOpts, {
|
||||
complete: (opts) => engine.complete(Object.assign({}, opts, {
|
||||
desktopVision: false,
|
||||
timeoutMs: budget.completeTimeoutMs,
|
||||
@@ -643,7 +657,7 @@ async function runTurn(ctx) {
|
||||
emitUpdate(emit, session.id, jobId, {
|
||||
type: 'compaction',
|
||||
status: 'done',
|
||||
method: 'llm',
|
||||
method: budget.voice ? 'heuristic' : 'llm',
|
||||
used: afterUsage.used,
|
||||
limit: afterUsage.limit,
|
||||
pct: afterUsage.pct,
|
||||
@@ -715,7 +729,7 @@ async function runTurn(ctx) {
|
||||
// The estimate can be lower than the model's tokenizer count.
|
||||
// Every overflow retry must shrink even an apparently small history.
|
||||
budgetTokens: Math.min(
|
||||
compaction.historyBudget(ctxSize, toolDefs, overflowTry + 1, sidecarTokens),
|
||||
historyCompactOpts(session, toolDefs, ctxSize, sidecarTokens, budget, overflowTry + 1).budgetTokens,
|
||||
Math.max(1, Math.floor(compaction.conversationTokens(session.history) * 0.85))
|
||||
),
|
||||
tools: toolDefs,
|
||||
@@ -863,7 +877,9 @@ async function runTurn(ctx) {
|
||||
}
|
||||
if (stopEarly) break;
|
||||
}
|
||||
if (prepared.length) toolBudget.markToolRound(budget);
|
||||
if (prepared.some((item) => item.name !== 'todo_write' && item.name !== 'update_goal')) {
|
||||
toolBudget.markToolRound(budget);
|
||||
}
|
||||
if (stopEarly) {
|
||||
return endTurn(emit, session, jobId, tracker, stopEarly);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user