UNPKG

@sema-agent/core

Version:

Stateless, task-oriented AI agent core

77 lines (76 loc) • 4.53 kB
import { DEFAULT_COMPACTION_SETTINGS } from "../../internal/harness.js"; import { resolveTriggerWindow } from "../context-edit.js"; import { compactionEnabled, contextOverlayFor } from "../context-settings.js"; import { sanitizeCompactionSettings } from "../auto-compaction.js"; import { modelCostToPricing } from "../pricing.js"; import { emitTrace } from "../trace.js"; import { runWithReasoningWireFacts, runWithStatusSink } from "../../brain/status-sink.js"; import { sideCallBookOf } from "./side-call-account.js"; export function runCompactionMachinery(input) { const { spec, prepared, rs, stats, noteUnevaluablePriceTable, modelCatalog, runner } = input; const bookSideCall = sideCallBookOf(stats, { telemetry: rs.telemetry, pricing: () => runner.deps.pricing, noteUnevaluablePriceTable, catalog: modelCatalog }); prepared.sideCallBookRef.book = bookSideCall; const compactionBrain = { stream: runner.deps.brain.stream, complete: async (m, c, o) => { const msg = await runWithStatusSink(() => { }, async () => await runWithReasoningWireFacts(() => { }, async () => runner.deps.brain.complete ? await runner.deps.brain.complete(m, c, o) : await (await Promise.resolve(runner.deps.brain.stream(m, c, o))).result())); bookSideCall("compaction", m, msg); return msg; }, }; const legOverlay = () => contextOverlayFor(runner.deps.contextSettings, prepared.harness.getModelRef(), runner.deps); const withinTaskCompaction = () => compactionEnabled(spec.compaction?.enabled, legOverlay()) && (spec.compaction?.withinTask ?? true); const compactionBreaker = { failures: 0 }; if (compactionEnabled(spec.compaction?.enabled, legOverlay())) { const prefixWindow = resolveTriggerWindow(prepared.model, legOverlay()).window; if (Number.isFinite(prefixWindow) && prefixWindow > 0) { const prefixSettings = sanitizeCompactionSettings({ ...DEFAULT_COMPACTION_SETTINGS, ...spec.compaction }, prefixWindow); const prefixCompactAt = prefixWindow - prefixSettings.reserveTokens; if (prepared.promptOverheadTokens >= prefixCompactAt) { runner.deps.onError?.(new Error(`compaction cannot help: the fixed request prefix (system prompt + tool schemas, ≈${prepared.promptOverheadTokens} tokens) ` + `already meets or exceeds the compaction threshold (${prefixCompactAt} of a ${prefixWindow}-token window). ` + `Compaction only shrinks conversation history, so this run will re-trigger or overflow regardless — ` + `shrink the system prompt/tool surface or use a larger-window model.`), { phase: "config", sessionId: prepared.sessionId }); } } } const windowSafetyOptions = (mainModel) => ({ ...(rs.budget.maxCostMicroUsd !== undefined ? { fallbackBudget: { spentMicroUsd: () => stats.costMicroUsd, capMicroUsd: rs.budget.maxCostMicroUsd, mainInputPer1M: (runner.deps.pricing?.[mainModel.id] ?? modelCostToPricing(mainModel.cost)).inputPer1M, }, } : {}), onWindowSafety: (info) => { if (info.kind === "fallback") { emitTrace(rs.telemetry.tracer, () => ({ kind: "compaction.model_fallback", version: 1, taskId: rs.telemetry.taskId, contentTokens: info.contentTokens, headroomTokens: info.headroomTokens ?? 0, truncationRatio: info.truncationRatio, ...(info.estCostMicroUsd !== undefined ? { estCostMicroUsd: info.estCostMicroUsd } : {}), ts: Date.now(), })); } else { emitTrace(rs.telemetry.tracer, () => ({ kind: "compaction.clamp_disclosure", version: 1, taskId: rs.telemetry.taskId, truncationRatio: info.truncationRatio, reason: info.reason ?? "tolerance", ...(info.estCostMicroUsd !== undefined ? { estCostMicroUsd: info.estCostMicroUsd } : {}), ts: Date.now(), })); } }, }); return { compactionBrain, withinTaskCompaction, compactionBreaker, windowSafetyOptions, bookSideCall }; }