




















@@ -179,9 +179,7 @@ import {
179179buildEmptyExplicitToolAllowlistError,
180180collectExplicitToolAllowlistSources,
181181} from "../../tool-allowlist-guard.js";
182-import {
183-filterRuntimeCompatibleTools,
184-} from "../../tool-schema-projection.js";
182+import { filterRuntimeCompatibleTools } from "../../tool-schema-projection.js";
185183import { logRuntimeToolSchemaQuarantine } from "../../tool-schema-quarantine.js";
186184import {
187185addClientToolsToToolSearchCatalog,
@@ -266,6 +264,7 @@ import {
266264} from "../tool-result-context-guard.js";
267265import {
268266resolveLiveToolResultMaxChars,
267+truncateOversizedToolResultsInMessages,
269268truncateOversizedToolResultsInSessionManager,
270269} from "../tool-result-truncation.js";
271270import { splitSdkTools } from "../tool-split.js";
@@ -460,6 +459,7 @@ export {
460459};
461460462461const MAX_BTW_SNAPSHOT_MESSAGES = 100;
462+const PROMPT_TOOL_RESULT_AGGREGATE_CAP_MULTIPLIER = 4;
463463464464function summarizeMessagePayload(msg: AgentMessage): { textChars: number; imageBlocks: number } {
465465const content = (msg as { content?: unknown }).content;
@@ -3434,6 +3434,31 @@ export async function runEmbeddedAttempt(
34343434activeSession.agent.state.messages = filteredMessages;
34353435}
34363436prePromptMessageCount = activeSession.messages.length;
3437+const contextTokenBudget = params.contextTokenBudget ?? DEFAULT_CONTEXT_TOKENS;
3438+const promptToolResultMaxChars = resolveLiveToolResultMaxChars({
3439+contextWindowTokens: contextTokenBudget,
3440+cfg: params.config,
3441+agentId: sessionAgentId,
3442+});
3443+let promptHistoryMessages = activeSession.messages;
3444+const promptToolResultTruncation = truncateOversizedToolResultsInMessages(
3445+activeSession.messages,
3446+contextTokenBudget,
3447+promptToolResultMaxChars,
3448+promptToolResultMaxChars * PROMPT_TOOL_RESULT_AGGREGATE_CAP_MULTIPLIER,
3449+);
3450+if (promptToolResultTruncation.truncatedCount > 0) {
3451+promptHistoryMessages = promptToolResultTruncation.messages;
3452+log.info(
3453+`[tool-result-truncation] Truncated ${promptToolResultTruncation.truncatedCount} ` +
3454+`tool result(s) for prompt history ` +
3455+`(maxChars=${promptToolResultMaxChars} ` +
3456+`aggregateBudgetChars=${
3457+ promptToolResultMaxChars * PROMPT_TOOL_RESULT_AGGREGATE_CAP_MULTIPLIER
3458+ }) ` +
3459+`sessionKey=${params.sessionKey ?? params.sessionId ?? "unknown"}`,
3460+);
3461+}
3437346234383463const promptSubmission = resolveRuntimeContextPromptParts({
34393464effectivePrompt: promptForRuntimeContextSplit,
@@ -3470,8 +3495,8 @@ export async function runEmbeddedAttempt(
34703495const runtimeContextMessageForCurrentTurn =
34713496buildRuntimeContextCustomMessage(runtimeContextForHook);
34723497const messagesForCurrentPrompt = runtimeContextMessageForCurrentTurn
3473- ? [...activeSession.messages, runtimeContextMessageForCurrentTurn]
3474- : activeSession.messages;
3498+ ? [...promptHistoryMessages, runtimeContextMessageForCurrentTurn]
3499+ : promptHistoryMessages;
34753500const hookMessagesForCurrentPrompt = normalizeMessagesForCurrentPromptBoundary({
34763501messages: messagesForCurrentPrompt,
34773502prompt: promptForModel,
@@ -3705,7 +3730,6 @@ export async function runEmbeddedAttempt(
37053730const promptLen = effectivePrompt.length;
37063731const sessionSummary = summarizeSessionContext(activeSession.messages);
37073732const reserveTokens = settingsManager.getCompactionReserveTokens();
3708-const contextTokenBudget = params.contextTokenBudget ?? DEFAULT_CONTEXT_TOKENS;
37093733emitTrustedDiagnosticEvent({
37103734type: "context.assembled",
37113735runId: params.runId,
@@ -3789,11 +3813,7 @@ export async function runEmbeddedAttempt(
37893813prompt: promptForModel,
37903814 contextTokenBudget,
37913815 reserveTokens,
3792-toolResultMaxChars: resolveLiveToolResultMaxChars({
3793-contextWindowTokens: contextTokenBudget,
3794-cfg: params.config,
3795-agentId: sessionAgentId,
3796-}),
3816+toolResultMaxChars: promptToolResultMaxChars,
37973817});
37983818if (preemptiveCompaction) {
37993819contextBudgetStatus = buildPrePromptContextBudgetStatus({
@@ -3901,6 +3921,29 @@ export async function runEmbeddedAttempt(
39013921if (normalizedReplayMessages !== activeSession.messages) {
39023922activeSession.agent.state.messages = normalizedReplayMessages;
39033923}
3924+const installProviderPromptHistoryTransform = (): (() => void) => {
3925+const baseStreamFn = activeSession.agent.streamFn;
3926+const providerPromptStreamFn = wrapStreamFnWithMessageTransform(
3927+baseStreamFn,
3928+(messages) => {
3929+const providerPromptHistoryTruncation = truncateOversizedToolResultsInMessages(
3930+messages,
3931+contextTokenBudget,
3932+promptToolResultMaxChars,
3933+promptToolResultMaxChars * PROMPT_TOOL_RESULT_AGGREGATE_CAP_MULTIPLIER,
3934+);
3935+return providerPromptHistoryTruncation.truncatedCount > 0
3936+ ? providerPromptHistoryTruncation.messages
3937+ : messages;
3938+},
3939+);
3940+activeSession.agent.streamFn = providerPromptStreamFn;
3941+return () => {
3942+if (activeSession.agent.streamFn === providerPromptStreamFn) {
3943+activeSession.agent.streamFn = baseStreamFn;
3944+}
3945+};
3946+};
39043947finalPromptText = promptForSession;
39053948trajectoryRecorder?.recordEvent("prompt.submitted", {
39063949prompt: promptForModel,
@@ -3928,6 +3971,7 @@ export async function runEmbeddedAttempt(
39283971captureCurrentPromptForModel = true;
39293972}
39303973};
3974+const cleanupProviderPromptHistoryTransform = installProviderPromptHistoryTransform();
39313975try {
39323976if (promptSubmission.runtimeOnly) {
39333977await promptActiveSession(promptForSession, {
@@ -3956,6 +4000,7 @@ export async function runEmbeddedAttempt(
39564000}
39574001}
39584002} finally {
4003+cleanupProviderPromptHistoryTransform();
39594004cleanupModelPromptTransform();
39604005}
39614006}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。