@librechat/agents 3.1.60 → 3.1.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,7 +21,7 @@ const SUMMARY_WRAPPER_OVERHEAD_TOKENS = 33;
21
21
  /** Structured checkpoint prompt for fresh summarization (no prior summary). */
22
22
  const DEFAULT_SUMMARIZATION_PROMPT = `Hold on, before you continue I need you to write me a checkpoint of everything so far. Your context window is filling up and this checkpoint replaces the messages above, so capture everything you need to pick right back up.
23
23
 
24
- Don't second-guess or fact-check anything you did, your tool results reflect exactly what happened. Just record what you did and what you observed. Only the checkpoint, don't respond to me or continue the conversation.
24
+ Don't second-guess or fact-check anything you did, your tool results reflect exactly what happened. If a tool result appears truncated, that's just a display artifact from context management: the tool executed fully. Just record what you did and what you observed. Only the checkpoint, don't respond to me or continue the conversation.
25
25
 
26
26
  ## Checkpoint
27
27
 
@@ -58,7 +58,7 @@ const DEFAULT_UPDATE_SUMMARIZATION_PROMPT = `Hold on again, update your checkpoi
58
58
 
59
59
  Keep it roughly the same length as your last checkpoint. Compress older details to make room for what's new, don't just append. Give recent actions more detail, compress older items to one-liners.
60
60
 
61
- Don't fact-check or second-guess anything, your tool results are ground truth. Only the checkpoint, don't respond to me or continue the conversation.
61
+ Don't fact-check or second-guess anything, your tool results are ground truth. If a tool result appears truncated, that's just a display artifact: the tool executed fully. Only the checkpoint, don't respond to me or continue the conversation.
62
62
 
63
63
  Rules:
64
64
  - Merge new progress into existing sections, don't duplicate headers
@@ -1 +1 @@
1
- {"version":3,"file":"node.cjs","sources":["../../../src/summarization/node.ts"],"sourcesContent":["import {\n AIMessage,\n ToolMessage,\n HumanMessage,\n SystemMessage,\n} from '@langchain/core/messages';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type { UsageMetadata, BaseMessage } from '@langchain/core/messages';\nimport type { AgentContext } from '@/agents/AgentContext';\nimport type { OnChunk } from '@/llm/invoke';\nimport type * as t from '@/types';\nimport { ContentTypes, GraphEvents, StepTypes, Providers } from '@/common';\nimport { safeDispatchCustomEvent, emitAgentLog } from '@/utils/events';\nimport { attemptInvoke, tryFallbackProviders } from '@/llm/invoke';\nimport { createRemoveAllMessage } from '@/messages/reducer';\nimport { getMaxOutputTokensKey } from '@/llm/request';\nimport { addCacheControl } from '@/messages/cache';\nimport { initializeModel } from '@/llm/init';\nimport { getChunkContent } from '@/stream';\n\nconst SUMMARIZATION_PARAM_KEYS = new Set(['maxSummaryTokens']);\n\n/**\n * Token overhead of the XML wrapper + instruction text added around the\n * summary at injection time in AgentContext.buildSystemRunnable:\n * `<summary>\\n${text}\\n</summary>\\n\\nYour context window was compacted...`\n * ~33 tokens on Anthropic, ~24-27 on OpenAI. Using 33 as a safe ceiling.\n */\nconst SUMMARY_WRAPPER_OVERHEAD_TOKENS = 33;\n\n/** Structured checkpoint prompt for fresh summarization (no prior summary). */\nexport const DEFAULT_SUMMARIZATION_PROMPT = `Hold on, before you continue I need you to write me a checkpoint of everything so far. Your context window is filling up and this checkpoint replaces the messages above, so capture everything you need to pick right back up.\n\nDon't second-guess or fact-check anything you did, your tool results reflect exactly what happened. Just record what you did and what you observed. Only the checkpoint, don't respond to me or continue the conversation.\n\n## Checkpoint\n\n## Goal\nWhat I asked you to do and any sub-goals you identified.\n\n## Constraints & Preferences\nAny rules, preferences, or configuration I established.\n\n## Progress\n### Done\n- What you completed and the outcomes\n\n### In Progress\n- What you're currently working on\n\n## Key Decisions\nDecisions you made and why.\n\n## Next Steps\nConcrete task actions remaining, in priority order.\n\n## Critical Context\nExact identifiers, names, error messages, URLs, and details you need to preserve verbatim.\n\nRules:\n- Record what you did and observed, don't judge or re-evaluate it\n- For each tool call: the tool name, key inputs, and the outcome\n- Preserve exact identifiers, names, errors, and references verbatim\n- Short declarative sentences\n- Skip empty sections`;\n\n/** Prompt for re-compaction when a prior summary exists. */\nexport const DEFAULT_UPDATE_SUMMARIZATION_PROMPT = `Hold on again, update your checkpoint. Merge the new messages into your existing checkpoint and give me a single consolidated replacement.\n\nKeep it roughly the same length as your last checkpoint. Compress older details to make room for what's new, don't just append. Give recent actions more detail, compress older items to one-liners.\n\nDon't fact-check or second-guess anything, your tool results are ground truth. Only the checkpoint, don't respond to me or continue the conversation.\n\nRules:\n- Merge new progress into existing sections, don't duplicate headers\n- Compress older completed items into one-line entries\n- Move items from \"In Progress\" to \"Done\" when you completed them\n- Update \"Next Steps\" to reflect current task priorities.\n- For each new tool call: the tool name, key inputs, and the outcome\n- Preserve exact identifiers, names, errors, and references verbatim\n- Skip empty sections`;\n\nfunction separateParameters(parameters: Record<string, unknown>): {\n llmParams: Record<string, unknown>;\n maxSummaryTokens?: number;\n} {\n const llmParams: Record<string, unknown> = {};\n let maxSummaryTokens: number | undefined;\n\n for (const [key, value] of Object.entries(parameters)) {\n if (SUMMARIZATION_PARAM_KEYS.has(key)) {\n if (\n key === 'maxSummaryTokens' &&\n typeof value === 'number' &&\n value > 0\n ) {\n maxSummaryTokens = value;\n }\n } else {\n llmParams[key] = value;\n }\n }\n\n return { llmParams, maxSummaryTokens };\n}\n\n/**\n * Generates a structural metadata summary without making an LLM call.\n * Used as a last-resort fallback when all summarization attempts fail.\n * Preserves tool names and message counts so the agent retains basic context.\n */\nfunction generateMetadataStub(messages: BaseMessage[]): string {\n const counts: Record<string, number> = {};\n const toolNames = new Set<string>();\n\n for (const msg of messages) {\n const role = msg.getType();\n counts[role] = (counts[role] ?? 0) + 1;\n\n if (role === 'tool' && msg.name != null && msg.name !== '') {\n toolNames.add(msg.name);\n }\n\n if (\n role === 'ai' &&\n msg instanceof AIMessage &&\n msg.tool_calls &&\n msg.tool_calls.length > 0\n ) {\n for (const tc of msg.tool_calls) {\n toolNames.add(tc.name);\n }\n }\n }\n\n const countParts = Object.entries(counts)\n .map(([role, count]) => `${count} ${role}`)\n .join(', ');\n\n const lines = [\n `[Metadata summary: ${messages.length} messages (${countParts})]`,\n ];\n\n if (toolNames.size > 0) {\n lines.push(`[Tools used: ${Array.from(toolNames).join(', ')}]`);\n }\n\n return lines.join('\\n');\n}\n\n/** Maximum number of tool failures to include in the enrichment section. */\nconst MAX_TOOL_FAILURES = 8;\n/** Maximum chars per failure summary line. */\nconst MAX_TOOL_FAILURE_CHARS = 240;\n\n/**\n * Extracts failed tool results from messages and formats them as a structured\n * section. LLMs often omit specific failure details (exit codes, error messages)\n * from their summaries, this mechanical enrichment guarantees they survive.\n */\nfunction extractToolFailuresSection(messages: BaseMessage[]): string {\n const failures: Array<{ toolName: string; summary: string }> = [];\n const seen = new Set<string>();\n\n for (const msg of messages) {\n if (msg.getType() !== 'tool') {\n continue;\n }\n const toolMsg = msg as ToolMessage;\n if (toolMsg.status !== 'error') {\n continue;\n }\n // Deduplicate by tool_call_id\n const callId = toolMsg.tool_call_id;\n if (callId && seen.has(callId)) {\n continue;\n }\n if (callId) {\n seen.add(callId);\n }\n\n const toolName = toolMsg.name ?? 'tool';\n const content =\n typeof toolMsg.content === 'string'\n ? toolMsg.content\n : JSON.stringify(toolMsg.content);\n const normalized = content.replace(/\\s+/g, ' ').trim();\n const summary =\n normalized.length > MAX_TOOL_FAILURE_CHARS\n ? `${normalized.slice(0, MAX_TOOL_FAILURE_CHARS - 3)}...`\n : normalized;\n\n failures.push({ toolName, summary });\n }\n\n if (failures.length === 0) {\n return '';\n }\n\n const lines = failures\n .slice(0, MAX_TOOL_FAILURES)\n .map((f) => `- ${f.toolName}: ${f.summary}`);\n if (failures.length > MAX_TOOL_FAILURES) {\n lines.push(`- ...and ${failures.length - MAX_TOOL_FAILURES} more`);\n }\n\n return `\\n\\n## Tool Failures\\n${lines.join('\\n')}`;\n}\n\n/**\n * Appends mechanical enrichment sections to an LLM-generated summary.\n * Tool failures are appended verbatim because LLMs often omit specific\n * error details from their summaries.\n */\nfunction enrichSummary(summaryText: string, messages: BaseMessage[]): string {\n return summaryText + extractToolFailuresSection(messages);\n}\n\n/**\n * Restores pre-masking tool content onto the messages array using\n * `pendingOriginalToolContent` stored on AgentContext. Only allocates\n * a new array when there are entries to restore; otherwise returns the\n * input reference unchanged.\n */\nfunction restoreOriginalToolContent(\n messages: BaseMessage[],\n originalToolContent: Map<number, string> | undefined\n): BaseMessage[] {\n if (originalToolContent == null || originalToolContent.size === 0) {\n return messages;\n }\n const restored = [...messages];\n for (const [idx, content] of originalToolContent) {\n const msg = restored[idx];\n if (msg instanceof ToolMessage) {\n restored[idx] = new ToolMessage({\n content,\n tool_call_id: msg.tool_call_id,\n name: msg.name,\n id: msg.id,\n additional_kwargs: msg.additional_kwargs,\n response_metadata: msg.response_metadata,\n });\n }\n }\n return restored;\n}\n\n// ---------------------------------------------------------------------------\n// Extracted helpers for createSummarizeNode\n// ---------------------------------------------------------------------------\n\ninterface SummarizationClientConfig {\n provider: string;\n modelName?: string;\n clientOptions: Record<string, unknown>;\n effectiveMaxSummaryTokens?: number;\n promptText: string;\n updatePromptText: string;\n}\n\n/** Assembles the summarization model's client options from agent and config. */\nfunction buildSummarizationClientConfig(\n agentContext: AgentContext,\n summarizationConfig?: t.SummarizationConfig\n): SummarizationClientConfig {\n const provider = (summarizationConfig?.provider ??\n agentContext.provider) as string;\n const modelName = summarizationConfig?.model;\n const parameters = summarizationConfig?.parameters ?? {};\n const promptText =\n summarizationConfig?.prompt ?? DEFAULT_SUMMARIZATION_PROMPT;\n const updatePromptText =\n summarizationConfig?.updatePrompt ?? DEFAULT_UPDATE_SUMMARIZATION_PROMPT;\n\n const { llmParams, maxSummaryTokens: paramMaxSummaryTokens } =\n separateParameters(parameters);\n\n const isSelfSummarize = provider === (agentContext.provider as string);\n const baseOptions =\n isSelfSummarize && agentContext.clientOptions\n ? { ...agentContext.clientOptions }\n : {};\n\n const clientOptions: Record<string, unknown> = {\n ...baseOptions,\n ...llmParams,\n };\n\n if (modelName != null && modelName !== '') {\n clientOptions.model = modelName;\n clientOptions.modelName = modelName;\n }\n\n const effectiveMaxSummaryTokens =\n paramMaxSummaryTokens ?? summarizationConfig?.maxSummaryTokens;\n\n if (effectiveMaxSummaryTokens != null) {\n clientOptions[getMaxOutputTokensKey(provider)] = effectiveMaxSummaryTokens;\n }\n\n return {\n provider,\n modelName,\n clientOptions,\n effectiveMaxSummaryTokens,\n promptText,\n updatePromptText,\n };\n}\n\n/** Computes the token count for a summary, preferring provider output tokens when available. */\nfunction computeSummaryTokenCount(\n summaryText: string,\n summaryUsage: Partial<UsageMetadata> | undefined,\n tokenCounter?: (message: BaseMessage) => number\n): number {\n const providerOutputTokens = Number(summaryUsage?.output_tokens) || 0;\n if (providerOutputTokens > 0) {\n return providerOutputTokens + SUMMARY_WRAPPER_OVERHEAD_TOKENS;\n }\n if (tokenCounter) {\n return (\n tokenCounter(new SystemMessage(summaryText)) +\n SUMMARY_WRAPPER_OVERHEAD_TOKENS\n );\n }\n return 0;\n}\n\n/** Constructs the SummaryContentBlock persisted in the run step and dispatched to events. */\nfunction buildSummaryBlock(params: {\n summaryText: string;\n tokenCount: number;\n stepId: string;\n stepIndex: number;\n modelName?: string;\n provider: string;\n summaryVersion: number;\n}): t.SummaryContentBlock {\n return {\n type: ContentTypes.SUMMARY,\n content: [\n {\n type: ContentTypes.TEXT,\n text: params.summaryText,\n } as t.MessageContentComplex,\n ],\n tokenCount: params.tokenCount,\n summaryVersion: params.summaryVersion,\n boundary: {\n messageId: params.stepId,\n contentIndex: params.stepIndex,\n },\n model: params.modelName,\n provider: params.provider,\n createdAt: new Date().toISOString(),\n };\n}\n\ntype LogFn = (\n level: 'debug' | 'info' | 'warn' | 'error',\n message: string,\n data?: Record<string, unknown>\n) => void;\n\n/**\n * Runs the summarization LLM call with primary + fallback providers,\n * falling back to a metadata stub when all calls fail.\n */\nasync function executeSummarizationWithFallback(params: {\n agentContext: AgentContext;\n messages: BaseMessage[];\n clientConfig: SummarizationClientConfig;\n summarizeConfig?: RunnableConfig;\n stepId: string;\n usePromptCache: boolean;\n log: LogFn;\n}): Promise<{ text: string; usage?: Partial<UsageMetadata> }> {\n const {\n agentContext,\n messages,\n clientConfig,\n summarizeConfig,\n stepId,\n usePromptCache,\n log,\n } = params;\n\n const summarizationModel = initializeModel({\n provider: clientConfig.provider as Providers,\n clientOptions: clientConfig.clientOptions as t.ClientOptions,\n tools: agentContext.getToolsForBinding(),\n }) as t.ChatModel;\n\n const priorSummaryText = agentContext.getSummaryText()?.trim() ?? '';\n\n let summaryText = '';\n let summaryUsage: Partial<UsageMetadata> | undefined;\n\n try {\n const result = await summarizeWithCacheHit({\n model: summarizationModel,\n messages,\n promptText: clientConfig.promptText,\n updatePromptText: clientConfig.updatePromptText,\n priorSummaryText,\n config: summarizeConfig,\n stepId,\n provider: clientConfig.provider as Providers,\n reasoningKey: agentContext.reasoningKey,\n usePromptCache,\n log,\n });\n summaryText = result.text;\n summaryUsage = result.usage;\n } catch (primaryError) {\n log('error', 'Summarization LLM call failed', {\n error:\n primaryError instanceof Error\n ? primaryError.message\n : String(primaryError),\n provider: clientConfig.provider,\n model: clientConfig.modelName,\n messagesToRefineCount: messages.length,\n });\n\n const fallbacks =\n (clientConfig.clientOptions as unknown as t.LLMConfig | undefined)\n ?.fallbacks ?? [];\n if (fallbacks.length > 0) {\n try {\n const onChunk = createSummarizationChunkHandler({\n stepId,\n config: traceConfig(summarizeConfig, 'cache_hit_compaction'),\n provider: clientConfig.provider as Providers,\n reasoningKey: agentContext.reasoningKey,\n });\n const fbResult = await tryFallbackProviders({\n fallbacks,\n tools: agentContext.getToolsForBinding(),\n messages: [\n ...messages,\n new HumanMessage(\n buildSummarizationInstruction(\n clientConfig.promptText,\n clientConfig.updatePromptText,\n priorSummaryText\n )\n ),\n ],\n config: traceConfig(summarizeConfig, 'cache_hit_compaction'),\n primaryError,\n onChunk,\n });\n const fbMsg = fbResult?.messages?.[0];\n if (fbMsg) {\n summaryText = extractResponseText(\n fbMsg as { content: string | object }\n );\n }\n } catch (fbErr) {\n log('warn', 'Fallback providers also failed', {\n error: fbErr instanceof Error ? fbErr.message : String(fbErr),\n });\n }\n }\n if (!summaryText) {\n log('warn', 'Summarization failed, falling back to metadata stub', {\n error:\n primaryError instanceof Error\n ? primaryError.message\n : String(primaryError),\n });\n summaryText = generateMetadataStub(messages);\n }\n }\n\n return { text: summaryText, usage: summaryUsage };\n}\n\n/** Dispatches run step completion, ON_SUMMARIZE_COMPLETE, and rebuilds token map. */\nasync function dispatchCompletionEvents(params: {\n graph: CreateSummarizeNodeParams['graph'];\n runnableConfig?: RunnableConfig;\n stepId: string;\n summaryBlock: t.SummaryContentBlock;\n agentContext: AgentContext;\n runStep: t.RunStep;\n summaryUsage?: Partial<UsageMetadata>;\n agentId: string;\n}): Promise<void> {\n const {\n graph,\n runnableConfig,\n stepId,\n summaryBlock,\n agentContext,\n runStep,\n summaryUsage,\n agentId,\n } = params;\n\n runStep.summary = summaryBlock;\n if (summaryUsage) {\n runStep.usage = {\n prompt_tokens: Number(summaryUsage.input_tokens) || 0,\n completion_tokens: Number(summaryUsage.output_tokens) || 0,\n total_tokens:\n (Number(summaryUsage.input_tokens) || 0) +\n (Number(summaryUsage.output_tokens) || 0),\n };\n }\n\n await graph.dispatchRunStepCompleted(\n stepId,\n { type: 'summary', summary: summaryBlock } satisfies t.SummaryCompleted,\n runnableConfig\n );\n\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_COMPLETE,\n {\n id: stepId,\n agentId,\n summary: summaryBlock,\n } satisfies t.SummarizeCompleteEvent,\n runnableConfig\n );\n }\n\n agentContext.rebuildTokenMapAfterSummarization({});\n}\n\n// ---------------------------------------------------------------------------\n// createSummarizeNode\n// ---------------------------------------------------------------------------\n\ninterface CreateSummarizeNodeParams {\n agentContext: AgentContext;\n graph: {\n contentData: t.RunStep[];\n contentIndexMap: Map<string, number>;\n config?: RunnableConfig;\n runId?: string;\n isMultiAgent: boolean;\n dispatchRunStep: (\n runStep: t.RunStep,\n config?: RunnableConfig\n ) => Promise<void>;\n dispatchRunStepCompleted: (\n stepId: string,\n result: t.StepCompleted,\n config?: RunnableConfig\n ) => Promise<void>;\n };\n generateStepId: (stepKey: string) => [string, number];\n}\n\nexport function createSummarizeNode({\n agentContext,\n graph,\n generateStepId,\n}: CreateSummarizeNodeParams) {\n return async (\n state: {\n messages: BaseMessage[];\n summarizationRequest?: t.SummarizationNodeInput;\n },\n config?: RunnableConfig\n ): Promise<{ summarizationRequest: undefined; messages?: BaseMessage[] }> => {\n const request = state.summarizationRequest;\n if (request == null) {\n return { summarizationRequest: undefined };\n }\n\n const maxCtx = agentContext.maxContextTokens ?? 0;\n if (maxCtx > 0 && agentContext.instructionTokens >= maxCtx) {\n emitAgentLog(\n config,\n 'warn',\n 'summarize',\n 'Summarization skipped, instructions exceed context budget. Reduce the number of tools or increase maxContextTokens.',\n {\n instructionTokens: agentContext.instructionTokens,\n maxContextTokens: maxCtx,\n breakdown: agentContext.formatTokenBudgetBreakdown(),\n },\n { runId: graph.runId, agentId: request.agentId }\n );\n return { summarizationRequest: undefined };\n }\n\n const messagesToRefine = restoreOriginalToolContent(\n state.messages,\n agentContext.pendingOriginalToolContent\n );\n agentContext.pendingOriginalToolContent = undefined;\n\n const clientConfig = buildSummarizationClientConfig(\n agentContext,\n agentContext.summarizationConfig\n );\n\n const runnableConfig = config ?? graph.config;\n\n const stepKey = `summarize-${request.agentId}`;\n const [stepId, stepIndex] = generateStepId(stepKey);\n\n const placeholderSummary: t.SummaryContentBlock = {\n type: ContentTypes.SUMMARY,\n model: clientConfig.modelName,\n provider: clientConfig.provider,\n };\n\n const runStep: t.RunStep = {\n stepIndex,\n id: stepId,\n type: StepTypes.MESSAGE_CREATION,\n index: graph.contentData.length,\n stepDetails: {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: { message_id: stepId },\n },\n summary: placeholderSummary,\n usage: null,\n };\n\n if (graph.runId != null && graph.runId !== '') {\n runStep.runId = graph.runId;\n }\n if (graph.isMultiAgent && agentContext.agentId) {\n runStep.agentId = agentContext.agentId;\n }\n\n await graph.dispatchRunStep(runStep, runnableConfig);\n\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_START,\n {\n agentId: request.agentId,\n provider: clientConfig.provider,\n model: clientConfig.modelName,\n messagesToRefineCount: messagesToRefine.length,\n summaryVersion: agentContext.summaryVersion + 1,\n } satisfies t.SummarizeStartEvent,\n runnableConfig\n );\n }\n\n const isSelfSummarizeModel =\n clientConfig.provider === (agentContext.provider as string);\n const hasPromptCache =\n isSelfSummarizeModel &&\n (agentContext.clientOptions as Record<string, unknown> | undefined)\n ?.promptCache === true;\n\n const log: LogFn = (level, message, data) => {\n emitAgentLog(runnableConfig, level, 'summarize', message, data, {\n runId: graph.runId,\n agentId: request.agentId,\n });\n };\n\n log('debug', 'Summarization starting', {\n messagesToRefineCount: messagesToRefine.length,\n hasPriorSummary: (agentContext.getSummaryText()?.trim() ?? '') !== '',\n summaryVersion: agentContext.summaryVersion + 1,\n isSelfSummarize: isSelfSummarizeModel,\n hasPromptCache,\n provider: clientConfig.provider,\n });\n\n const summarizeConfig: RunnableConfig | undefined = config\n ? {\n ...config,\n metadata: {\n ...config.metadata,\n agent_id: request.agentId,\n summarization_provider: clientConfig.provider,\n summarization_model: clientConfig.modelName,\n },\n }\n : undefined;\n\n const { text: rawText, usage: summaryUsage } =\n await executeSummarizationWithFallback({\n agentContext,\n messages: messagesToRefine,\n clientConfig,\n summarizeConfig,\n stepId,\n usePromptCache: isSelfSummarizeModel && hasPromptCache,\n log,\n });\n\n if (!rawText) {\n agentContext.markSummarizationTriggered(0);\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_COMPLETE,\n {\n id: stepId,\n agentId: request.agentId,\n error: 'Summarization produced empty output',\n } satisfies t.SummarizeCompleteEvent,\n runnableConfig\n );\n }\n return { summarizationRequest: undefined };\n }\n\n const summaryText = enrichSummary(rawText, messagesToRefine);\n\n const tokenCount = computeSummaryTokenCount(\n summaryText,\n summaryUsage,\n agentContext.tokenCounter\n );\n\n agentContext.setSummary(summaryText, tokenCount);\n\n log('info', 'Summary persisted');\n log('debug', 'Summary details', {\n summaryTokens: tokenCount,\n textLength: summaryText.length,\n messagesCompacted: messagesToRefine.length,\n summaryVersion: agentContext.summaryVersion,\n ...(summaryUsage != null\n ? {\n input_tokens: summaryUsage.input_tokens,\n output_tokens: summaryUsage.output_tokens,\n cache_read: summaryUsage.input_token_details?.cache_read,\n cache_creation: summaryUsage.input_token_details?.cache_creation,\n }\n : {}),\n });\n\n const summaryBlock = buildSummaryBlock({\n summaryText,\n tokenCount,\n stepId,\n stepIndex: runStep.index,\n modelName: clientConfig.modelName,\n provider: clientConfig.provider,\n summaryVersion: agentContext.summaryVersion,\n });\n\n await dispatchCompletionEvents({\n graph,\n runnableConfig,\n stepId,\n summaryBlock,\n agentContext,\n runStep,\n summaryUsage,\n agentId: request.agentId,\n });\n\n return {\n summarizationRequest: undefined,\n messages: [createRemoveAllMessage()],\n };\n };\n}\n\n/** Extracts text from an LLM response, skipping reasoning/thinking blocks. */\nfunction extractResponseText(response: { content: string | object }): string {\n const { content } = response;\n if (typeof content === 'string') {\n return content.trim();\n }\n if (!Array.isArray(content)) {\n return '';\n }\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === 'string') {\n parts.push(block);\n continue;\n }\n if (block == null || typeof block !== 'object') {\n continue;\n }\n const rec = block as Record<string, unknown>;\n if (\n rec.type === ContentTypes.THINKING ||\n rec.type === ContentTypes.REASONING_CONTENT ||\n rec.type === 'redacted_thinking'\n ) {\n continue;\n }\n if (rec.type === 'text' && typeof rec.text === 'string') {\n parts.push(rec.text);\n }\n }\n return parts.join('').trim();\n}\n\nfunction buildSummarizationInstruction(\n promptText: string,\n updatePromptText: string | undefined,\n priorSummaryText: string\n): string {\n const effectivePrompt = priorSummaryText\n ? (updatePromptText ?? promptText)\n : promptText;\n const parts = [effectivePrompt];\n if (priorSummaryText) {\n parts.push(\n `\\n\\n<previous-summary>\\n${priorSummaryText}\\n</previous-summary>`\n );\n }\n return parts.join('');\n}\n\n/** Creates an `onChunk` callback that dispatches `ON_SUMMARIZE_DELTA` events for streaming. */\nfunction createSummarizationChunkHandler({\n stepId,\n config,\n provider,\n reasoningKey = 'reasoning_content',\n}: {\n stepId?: string;\n config?: RunnableConfig;\n provider?: Providers;\n reasoningKey?: 'reasoning_content' | 'reasoning';\n}): OnChunk | undefined {\n if (stepId == null || stepId === '' || !config) {\n return undefined;\n }\n return (chunk) => {\n const chunkAny = chunk as Parameters<typeof getChunkContent>[0]['chunk'];\n const raw = getChunkContent({ chunk: chunkAny, provider, reasoningKey });\n if (raw == null || (typeof raw === 'string' && !raw)) {\n return;\n }\n const contentBlocks: t.MessageContentComplex[] =\n typeof raw === 'string'\n ? [{ type: ContentTypes.TEXT, text: raw } as t.MessageContentComplex]\n : raw;\n\n safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_DELTA,\n {\n id: stepId,\n delta: {\n summary: {\n type: ContentTypes.SUMMARY,\n content: contentBlocks,\n provider: String(config.metadata?.summarization_provider ?? ''),\n model: String(config.metadata?.summarization_model ?? ''),\n },\n },\n } satisfies t.SummarizeDeltaEvent,\n config\n );\n };\n}\n\nfunction traceConfig(\n config: RunnableConfig | undefined,\n stage: string\n): RunnableConfig | undefined {\n if (!config) {\n return undefined;\n }\n return {\n ...config,\n runName: `summarization:${stage}`,\n metadata: { ...config.metadata, summarization: true, stage },\n };\n}\n\n/**\n * Cache-friendly compaction: sends raw conversation messages with the\n * summarization instruction appended as the final HumanMessage.\n * Providers with prompt caching get a cache hit on the system prompt +\n * tool definitions prefix.\n */\nasync function summarizeWithCacheHit({\n model,\n messages,\n promptText,\n updatePromptText,\n priorSummaryText,\n config,\n stepId,\n provider,\n reasoningKey,\n usePromptCache,\n log,\n}: {\n model: t.ChatModel;\n messages: BaseMessage[];\n promptText: string;\n updatePromptText?: string;\n priorSummaryText: string;\n config?: RunnableConfig;\n stepId?: string;\n provider: Providers;\n reasoningKey?: 'reasoning_content' | 'reasoning';\n usePromptCache?: boolean;\n log?: LogFn;\n}): Promise<{ text: string; usage?: Partial<UsageMetadata> }> {\n const instruction = buildSummarizationInstruction(\n promptText,\n updatePromptText,\n priorSummaryText\n );\n\n const fullMessages = [...messages, new HumanMessage(instruction)];\n const invokeMessages =\n usePromptCache === true ? addCacheControl(fullMessages) : fullMessages;\n\n const result = await attemptInvoke(\n {\n model,\n messages: invokeMessages,\n provider,\n onChunk: createSummarizationChunkHandler({\n stepId,\n config: traceConfig(config, 'cache_hit_compaction'),\n provider,\n reasoningKey,\n }),\n },\n traceConfig(config, 'cache_hit_compaction')\n );\n\n const responseMsg = result.messages?.[0];\n const text = responseMsg\n ? extractResponseText(responseMsg as { content: string | object })\n : '';\n let usage: Partial<UsageMetadata> | undefined;\n let usageSource = 'none';\n if (\n responseMsg != null &&\n 'usage_metadata' in responseMsg &&\n responseMsg.usage_metadata != null\n ) {\n usage = responseMsg.usage_metadata as Partial<UsageMetadata>;\n usageSource = 'usage_metadata';\n } else if (responseMsg != null) {\n const respMeta = responseMsg.response_metadata as\n | Record<string, unknown>\n | undefined;\n const raw = (respMeta?.metadata as Record<string, unknown> | undefined)\n ?.usage as Record<string, unknown> | undefined;\n if (raw != null) {\n usage = {\n input_tokens: Number(raw.inputTokens) || undefined,\n output_tokens: Number(raw.outputTokens) || undefined,\n } as Partial<UsageMetadata>;\n usageSource = 'response_metadata';\n }\n }\n const cacheDetails = (\n usage as\n | {\n input_token_details?: {\n cache_read?: number;\n cache_creation?: number;\n };\n }\n | undefined\n )?.input_token_details;\n log?.('debug', 'Summarization LLM usage', {\n source: usageSource,\n input_tokens: usage?.input_tokens,\n output_tokens: usage?.output_tokens,\n ...(cacheDetails?.cache_read != null || cacheDetails?.cache_creation != null\n ? {\n 'input_token_details.cache_read': cacheDetails.cache_read,\n 'input_token_details.cache_creation': cacheDetails.cache_creation,\n }\n : {}),\n });\n return { text, usage };\n}\n"],"names":["messages","AIMessage","ToolMessage","getMaxOutputTokensKey","SystemMessage","ContentTypes","initializeModel","tryFallbackProviders","HumanMessage","safeDispatchCustomEvent","GraphEvents","emitAgentLog","StepTypes","createRemoveAllMessage","getChunkContent","addCacheControl","attemptInvoke"],"mappings":"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"}
1
+ {"version":3,"file":"node.cjs","sources":["../../../src/summarization/node.ts"],"sourcesContent":["import {\n AIMessage,\n ToolMessage,\n HumanMessage,\n SystemMessage,\n} from '@langchain/core/messages';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type { UsageMetadata, BaseMessage } from '@langchain/core/messages';\nimport type { AgentContext } from '@/agents/AgentContext';\nimport type { OnChunk } from '@/llm/invoke';\nimport type * as t from '@/types';\nimport { ContentTypes, GraphEvents, StepTypes, Providers } from '@/common';\nimport { safeDispatchCustomEvent, emitAgentLog } from '@/utils/events';\nimport { attemptInvoke, tryFallbackProviders } from '@/llm/invoke';\nimport { createRemoveAllMessage } from '@/messages/reducer';\nimport { getMaxOutputTokensKey } from '@/llm/request';\nimport { addCacheControl } from '@/messages/cache';\nimport { initializeModel } from '@/llm/init';\nimport { getChunkContent } from '@/stream';\n\nconst SUMMARIZATION_PARAM_KEYS = new Set(['maxSummaryTokens']);\n\n/**\n * Token overhead of the XML wrapper + instruction text added around the\n * summary at injection time in AgentContext.buildSystemRunnable:\n * `<summary>\\n${text}\\n</summary>\\n\\nYour context window was compacted...`\n * ~33 tokens on Anthropic, ~24-27 on OpenAI. Using 33 as a safe ceiling.\n */\nconst SUMMARY_WRAPPER_OVERHEAD_TOKENS = 33;\n\n/** Structured checkpoint prompt for fresh summarization (no prior summary). */\nexport const DEFAULT_SUMMARIZATION_PROMPT = `Hold on, before you continue I need you to write me a checkpoint of everything so far. Your context window is filling up and this checkpoint replaces the messages above, so capture everything you need to pick right back up.\n\nDon't second-guess or fact-check anything you did, your tool results reflect exactly what happened. If a tool result appears truncated, that's just a display artifact from context management: the tool executed fully. Just record what you did and what you observed. Only the checkpoint, don't respond to me or continue the conversation.\n\n## Checkpoint\n\n## Goal\nWhat I asked you to do and any sub-goals you identified.\n\n## Constraints & Preferences\nAny rules, preferences, or configuration I established.\n\n## Progress\n### Done\n- What you completed and the outcomes\n\n### In Progress\n- What you're currently working on\n\n## Key Decisions\nDecisions you made and why.\n\n## Next Steps\nConcrete task actions remaining, in priority order.\n\n## Critical Context\nExact identifiers, names, error messages, URLs, and details you need to preserve verbatim.\n\nRules:\n- Record what you did and observed, don't judge or re-evaluate it\n- For each tool call: the tool name, key inputs, and the outcome\n- Preserve exact identifiers, names, errors, and references verbatim\n- Short declarative sentences\n- Skip empty sections`;\n\n/** Prompt for re-compaction when a prior summary exists. */\nexport const DEFAULT_UPDATE_SUMMARIZATION_PROMPT = `Hold on again, update your checkpoint. Merge the new messages into your existing checkpoint and give me a single consolidated replacement.\n\nKeep it roughly the same length as your last checkpoint. Compress older details to make room for what's new, don't just append. Give recent actions more detail, compress older items to one-liners.\n\nDon't fact-check or second-guess anything, your tool results are ground truth. If a tool result appears truncated, that's just a display artifact: the tool executed fully. Only the checkpoint, don't respond to me or continue the conversation.\n\nRules:\n- Merge new progress into existing sections, don't duplicate headers\n- Compress older completed items into one-line entries\n- Move items from \"In Progress\" to \"Done\" when you completed them\n- Update \"Next Steps\" to reflect current task priorities.\n- For each new tool call: the tool name, key inputs, and the outcome\n- Preserve exact identifiers, names, errors, and references verbatim\n- Skip empty sections`;\n\nfunction separateParameters(parameters: Record<string, unknown>): {\n llmParams: Record<string, unknown>;\n maxSummaryTokens?: number;\n} {\n const llmParams: Record<string, unknown> = {};\n let maxSummaryTokens: number | undefined;\n\n for (const [key, value] of Object.entries(parameters)) {\n if (SUMMARIZATION_PARAM_KEYS.has(key)) {\n if (\n key === 'maxSummaryTokens' &&\n typeof value === 'number' &&\n value > 0\n ) {\n maxSummaryTokens = value;\n }\n } else {\n llmParams[key] = value;\n }\n }\n\n return { llmParams, maxSummaryTokens };\n}\n\n/**\n * Generates a structural metadata summary without making an LLM call.\n * Used as a last-resort fallback when all summarization attempts fail.\n * Preserves tool names and message counts so the agent retains basic context.\n */\nfunction generateMetadataStub(messages: BaseMessage[]): string {\n const counts: Record<string, number> = {};\n const toolNames = new Set<string>();\n\n for (const msg of messages) {\n const role = msg.getType();\n counts[role] = (counts[role] ?? 0) + 1;\n\n if (role === 'tool' && msg.name != null && msg.name !== '') {\n toolNames.add(msg.name);\n }\n\n if (\n role === 'ai' &&\n msg instanceof AIMessage &&\n msg.tool_calls &&\n msg.tool_calls.length > 0\n ) {\n for (const tc of msg.tool_calls) {\n toolNames.add(tc.name);\n }\n }\n }\n\n const countParts = Object.entries(counts)\n .map(([role, count]) => `${count} ${role}`)\n .join(', ');\n\n const lines = [\n `[Metadata summary: ${messages.length} messages (${countParts})]`,\n ];\n\n if (toolNames.size > 0) {\n lines.push(`[Tools used: ${Array.from(toolNames).join(', ')}]`);\n }\n\n return lines.join('\\n');\n}\n\n/** Maximum number of tool failures to include in the enrichment section. */\nconst MAX_TOOL_FAILURES = 8;\n/** Maximum chars per failure summary line. */\nconst MAX_TOOL_FAILURE_CHARS = 240;\n\n/**\n * Extracts failed tool results from messages and formats them as a structured\n * section. LLMs often omit specific failure details (exit codes, error messages)\n * from their summaries, this mechanical enrichment guarantees they survive.\n */\nfunction extractToolFailuresSection(messages: BaseMessage[]): string {\n const failures: Array<{ toolName: string; summary: string }> = [];\n const seen = new Set<string>();\n\n for (const msg of messages) {\n if (msg.getType() !== 'tool') {\n continue;\n }\n const toolMsg = msg as ToolMessage;\n if (toolMsg.status !== 'error') {\n continue;\n }\n // Deduplicate by tool_call_id\n const callId = toolMsg.tool_call_id;\n if (callId && seen.has(callId)) {\n continue;\n }\n if (callId) {\n seen.add(callId);\n }\n\n const toolName = toolMsg.name ?? 'tool';\n const content =\n typeof toolMsg.content === 'string'\n ? toolMsg.content\n : JSON.stringify(toolMsg.content);\n const normalized = content.replace(/\\s+/g, ' ').trim();\n const summary =\n normalized.length > MAX_TOOL_FAILURE_CHARS\n ? `${normalized.slice(0, MAX_TOOL_FAILURE_CHARS - 3)}...`\n : normalized;\n\n failures.push({ toolName, summary });\n }\n\n if (failures.length === 0) {\n return '';\n }\n\n const lines = failures\n .slice(0, MAX_TOOL_FAILURES)\n .map((f) => `- ${f.toolName}: ${f.summary}`);\n if (failures.length > MAX_TOOL_FAILURES) {\n lines.push(`- ...and ${failures.length - MAX_TOOL_FAILURES} more`);\n }\n\n return `\\n\\n## Tool Failures\\n${lines.join('\\n')}`;\n}\n\n/**\n * Appends mechanical enrichment sections to an LLM-generated summary.\n * Tool failures are appended verbatim because LLMs often omit specific\n * error details from their summaries.\n */\nfunction enrichSummary(summaryText: string, messages: BaseMessage[]): string {\n return summaryText + extractToolFailuresSection(messages);\n}\n\n/**\n * Restores pre-masking tool content onto the messages array using\n * `pendingOriginalToolContent` stored on AgentContext. Only allocates\n * a new array when there are entries to restore; otherwise returns the\n * input reference unchanged.\n */\nfunction restoreOriginalToolContent(\n messages: BaseMessage[],\n originalToolContent: Map<number, string> | undefined\n): BaseMessage[] {\n if (originalToolContent == null || originalToolContent.size === 0) {\n return messages;\n }\n const restored = [...messages];\n for (const [idx, content] of originalToolContent) {\n const msg = restored[idx];\n if (msg instanceof ToolMessage) {\n restored[idx] = new ToolMessage({\n content,\n tool_call_id: msg.tool_call_id,\n name: msg.name,\n id: msg.id,\n additional_kwargs: msg.additional_kwargs,\n response_metadata: msg.response_metadata,\n });\n }\n }\n return restored;\n}\n\n// ---------------------------------------------------------------------------\n// Extracted helpers for createSummarizeNode\n// ---------------------------------------------------------------------------\n\ninterface SummarizationClientConfig {\n provider: string;\n modelName?: string;\n clientOptions: Record<string, unknown>;\n effectiveMaxSummaryTokens?: number;\n promptText: string;\n updatePromptText: string;\n}\n\n/** Assembles the summarization model's client options from agent and config. */\nfunction buildSummarizationClientConfig(\n agentContext: AgentContext,\n summarizationConfig?: t.SummarizationConfig\n): SummarizationClientConfig {\n const provider = (summarizationConfig?.provider ??\n agentContext.provider) as string;\n const modelName = summarizationConfig?.model;\n const parameters = summarizationConfig?.parameters ?? {};\n const promptText =\n summarizationConfig?.prompt ?? DEFAULT_SUMMARIZATION_PROMPT;\n const updatePromptText =\n summarizationConfig?.updatePrompt ?? DEFAULT_UPDATE_SUMMARIZATION_PROMPT;\n\n const { llmParams, maxSummaryTokens: paramMaxSummaryTokens } =\n separateParameters(parameters);\n\n const isSelfSummarize = provider === (agentContext.provider as string);\n const baseOptions =\n isSelfSummarize && agentContext.clientOptions\n ? { ...agentContext.clientOptions }\n : {};\n\n const clientOptions: Record<string, unknown> = {\n ...baseOptions,\n ...llmParams,\n };\n\n if (modelName != null && modelName !== '') {\n clientOptions.model = modelName;\n clientOptions.modelName = modelName;\n }\n\n const effectiveMaxSummaryTokens =\n paramMaxSummaryTokens ?? summarizationConfig?.maxSummaryTokens;\n\n if (effectiveMaxSummaryTokens != null) {\n clientOptions[getMaxOutputTokensKey(provider)] = effectiveMaxSummaryTokens;\n }\n\n return {\n provider,\n modelName,\n clientOptions,\n effectiveMaxSummaryTokens,\n promptText,\n updatePromptText,\n };\n}\n\n/** Computes the token count for a summary, preferring provider output tokens when available. */\nfunction computeSummaryTokenCount(\n summaryText: string,\n summaryUsage: Partial<UsageMetadata> | undefined,\n tokenCounter?: (message: BaseMessage) => number\n): number {\n const providerOutputTokens = Number(summaryUsage?.output_tokens) || 0;\n if (providerOutputTokens > 0) {\n return providerOutputTokens + SUMMARY_WRAPPER_OVERHEAD_TOKENS;\n }\n if (tokenCounter) {\n return (\n tokenCounter(new SystemMessage(summaryText)) +\n SUMMARY_WRAPPER_OVERHEAD_TOKENS\n );\n }\n return 0;\n}\n\n/** Constructs the SummaryContentBlock persisted in the run step and dispatched to events. */\nfunction buildSummaryBlock(params: {\n summaryText: string;\n tokenCount: number;\n stepId: string;\n stepIndex: number;\n modelName?: string;\n provider: string;\n summaryVersion: number;\n}): t.SummaryContentBlock {\n return {\n type: ContentTypes.SUMMARY,\n content: [\n {\n type: ContentTypes.TEXT,\n text: params.summaryText,\n } as t.MessageContentComplex,\n ],\n tokenCount: params.tokenCount,\n summaryVersion: params.summaryVersion,\n boundary: {\n messageId: params.stepId,\n contentIndex: params.stepIndex,\n },\n model: params.modelName,\n provider: params.provider,\n createdAt: new Date().toISOString(),\n };\n}\n\ntype LogFn = (\n level: 'debug' | 'info' | 'warn' | 'error',\n message: string,\n data?: Record<string, unknown>\n) => void;\n\n/**\n * Runs the summarization LLM call with primary + fallback providers,\n * falling back to a metadata stub when all calls fail.\n */\nasync function executeSummarizationWithFallback(params: {\n agentContext: AgentContext;\n messages: BaseMessage[];\n clientConfig: SummarizationClientConfig;\n summarizeConfig?: RunnableConfig;\n stepId: string;\n usePromptCache: boolean;\n log: LogFn;\n}): Promise<{ text: string; usage?: Partial<UsageMetadata> }> {\n const {\n agentContext,\n messages,\n clientConfig,\n summarizeConfig,\n stepId,\n usePromptCache,\n log,\n } = params;\n\n const summarizationModel = initializeModel({\n provider: clientConfig.provider as Providers,\n clientOptions: clientConfig.clientOptions as t.ClientOptions,\n tools: agentContext.getToolsForBinding(),\n }) as t.ChatModel;\n\n const priorSummaryText = agentContext.getSummaryText()?.trim() ?? '';\n\n let summaryText = '';\n let summaryUsage: Partial<UsageMetadata> | undefined;\n\n try {\n const result = await summarizeWithCacheHit({\n model: summarizationModel,\n messages,\n promptText: clientConfig.promptText,\n updatePromptText: clientConfig.updatePromptText,\n priorSummaryText,\n config: summarizeConfig,\n stepId,\n provider: clientConfig.provider as Providers,\n reasoningKey: agentContext.reasoningKey,\n usePromptCache,\n log,\n });\n summaryText = result.text;\n summaryUsage = result.usage;\n } catch (primaryError) {\n log('error', 'Summarization LLM call failed', {\n error:\n primaryError instanceof Error\n ? primaryError.message\n : String(primaryError),\n provider: clientConfig.provider,\n model: clientConfig.modelName,\n messagesToRefineCount: messages.length,\n });\n\n const fallbacks =\n (clientConfig.clientOptions as unknown as t.LLMConfig | undefined)\n ?.fallbacks ?? [];\n if (fallbacks.length > 0) {\n try {\n const onChunk = createSummarizationChunkHandler({\n stepId,\n config: traceConfig(summarizeConfig, 'cache_hit_compaction'),\n provider: clientConfig.provider as Providers,\n reasoningKey: agentContext.reasoningKey,\n });\n const fbResult = await tryFallbackProviders({\n fallbacks,\n tools: agentContext.getToolsForBinding(),\n messages: [\n ...messages,\n new HumanMessage(\n buildSummarizationInstruction(\n clientConfig.promptText,\n clientConfig.updatePromptText,\n priorSummaryText\n )\n ),\n ],\n config: traceConfig(summarizeConfig, 'cache_hit_compaction'),\n primaryError,\n onChunk,\n });\n const fbMsg = fbResult?.messages?.[0];\n if (fbMsg) {\n summaryText = extractResponseText(\n fbMsg as { content: string | object }\n );\n }\n } catch (fbErr) {\n log('warn', 'Fallback providers also failed', {\n error: fbErr instanceof Error ? fbErr.message : String(fbErr),\n });\n }\n }\n if (!summaryText) {\n log('warn', 'Summarization failed, falling back to metadata stub', {\n error:\n primaryError instanceof Error\n ? primaryError.message\n : String(primaryError),\n });\n summaryText = generateMetadataStub(messages);\n }\n }\n\n return { text: summaryText, usage: summaryUsage };\n}\n\n/** Dispatches run step completion, ON_SUMMARIZE_COMPLETE, and rebuilds token map. */\nasync function dispatchCompletionEvents(params: {\n graph: CreateSummarizeNodeParams['graph'];\n runnableConfig?: RunnableConfig;\n stepId: string;\n summaryBlock: t.SummaryContentBlock;\n agentContext: AgentContext;\n runStep: t.RunStep;\n summaryUsage?: Partial<UsageMetadata>;\n agentId: string;\n}): Promise<void> {\n const {\n graph,\n runnableConfig,\n stepId,\n summaryBlock,\n agentContext,\n runStep,\n summaryUsage,\n agentId,\n } = params;\n\n runStep.summary = summaryBlock;\n if (summaryUsage) {\n runStep.usage = {\n prompt_tokens: Number(summaryUsage.input_tokens) || 0,\n completion_tokens: Number(summaryUsage.output_tokens) || 0,\n total_tokens:\n (Number(summaryUsage.input_tokens) || 0) +\n (Number(summaryUsage.output_tokens) || 0),\n };\n }\n\n await graph.dispatchRunStepCompleted(\n stepId,\n { type: 'summary', summary: summaryBlock } satisfies t.SummaryCompleted,\n runnableConfig\n );\n\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_COMPLETE,\n {\n id: stepId,\n agentId,\n summary: summaryBlock,\n } satisfies t.SummarizeCompleteEvent,\n runnableConfig\n );\n }\n\n agentContext.rebuildTokenMapAfterSummarization({});\n}\n\n// ---------------------------------------------------------------------------\n// createSummarizeNode\n// ---------------------------------------------------------------------------\n\ninterface CreateSummarizeNodeParams {\n agentContext: AgentContext;\n graph: {\n contentData: t.RunStep[];\n contentIndexMap: Map<string, number>;\n config?: RunnableConfig;\n runId?: string;\n isMultiAgent: boolean;\n dispatchRunStep: (\n runStep: t.RunStep,\n config?: RunnableConfig\n ) => Promise<void>;\n dispatchRunStepCompleted: (\n stepId: string,\n result: t.StepCompleted,\n config?: RunnableConfig\n ) => Promise<void>;\n };\n generateStepId: (stepKey: string) => [string, number];\n}\n\nexport function createSummarizeNode({\n agentContext,\n graph,\n generateStepId,\n}: CreateSummarizeNodeParams) {\n return async (\n state: {\n messages: BaseMessage[];\n summarizationRequest?: t.SummarizationNodeInput;\n },\n config?: RunnableConfig\n ): Promise<{ summarizationRequest: undefined; messages?: BaseMessage[] }> => {\n const request = state.summarizationRequest;\n if (request == null) {\n return { summarizationRequest: undefined };\n }\n\n const maxCtx = agentContext.maxContextTokens ?? 0;\n if (maxCtx > 0 && agentContext.instructionTokens >= maxCtx) {\n emitAgentLog(\n config,\n 'warn',\n 'summarize',\n 'Summarization skipped, instructions exceed context budget. Reduce the number of tools or increase maxContextTokens.',\n {\n instructionTokens: agentContext.instructionTokens,\n maxContextTokens: maxCtx,\n breakdown: agentContext.formatTokenBudgetBreakdown(),\n },\n { runId: graph.runId, agentId: request.agentId }\n );\n return { summarizationRequest: undefined };\n }\n\n const messagesToRefine = restoreOriginalToolContent(\n state.messages,\n agentContext.pendingOriginalToolContent\n );\n agentContext.pendingOriginalToolContent = undefined;\n\n const clientConfig = buildSummarizationClientConfig(\n agentContext,\n agentContext.summarizationConfig\n );\n\n const runnableConfig = config ?? graph.config;\n\n const stepKey = `summarize-${request.agentId}`;\n const [stepId, stepIndex] = generateStepId(stepKey);\n\n const placeholderSummary: t.SummaryContentBlock = {\n type: ContentTypes.SUMMARY,\n model: clientConfig.modelName,\n provider: clientConfig.provider,\n };\n\n const runStep: t.RunStep = {\n stepIndex,\n id: stepId,\n type: StepTypes.MESSAGE_CREATION,\n index: graph.contentData.length,\n stepDetails: {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: { message_id: stepId },\n },\n summary: placeholderSummary,\n usage: null,\n };\n\n if (graph.runId != null && graph.runId !== '') {\n runStep.runId = graph.runId;\n }\n if (graph.isMultiAgent && agentContext.agentId) {\n runStep.agentId = agentContext.agentId;\n }\n\n await graph.dispatchRunStep(runStep, runnableConfig);\n\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_START,\n {\n agentId: request.agentId,\n provider: clientConfig.provider,\n model: clientConfig.modelName,\n messagesToRefineCount: messagesToRefine.length,\n summaryVersion: agentContext.summaryVersion + 1,\n } satisfies t.SummarizeStartEvent,\n runnableConfig\n );\n }\n\n const isSelfSummarizeModel =\n clientConfig.provider === (agentContext.provider as string);\n const hasPromptCache =\n isSelfSummarizeModel &&\n (agentContext.clientOptions as Record<string, unknown> | undefined)\n ?.promptCache === true;\n\n const log: LogFn = (level, message, data) => {\n emitAgentLog(runnableConfig, level, 'summarize', message, data, {\n runId: graph.runId,\n agentId: request.agentId,\n });\n };\n\n log('debug', 'Summarization starting', {\n messagesToRefineCount: messagesToRefine.length,\n hasPriorSummary: (agentContext.getSummaryText()?.trim() ?? '') !== '',\n summaryVersion: agentContext.summaryVersion + 1,\n isSelfSummarize: isSelfSummarizeModel,\n hasPromptCache,\n provider: clientConfig.provider,\n });\n\n const summarizeConfig: RunnableConfig | undefined = config\n ? {\n ...config,\n metadata: {\n ...config.metadata,\n agent_id: request.agentId,\n summarization_provider: clientConfig.provider,\n summarization_model: clientConfig.modelName,\n },\n }\n : undefined;\n\n const { text: rawText, usage: summaryUsage } =\n await executeSummarizationWithFallback({\n agentContext,\n messages: messagesToRefine,\n clientConfig,\n summarizeConfig,\n stepId,\n usePromptCache: isSelfSummarizeModel && hasPromptCache,\n log,\n });\n\n if (!rawText) {\n agentContext.markSummarizationTriggered(0);\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_COMPLETE,\n {\n id: stepId,\n agentId: request.agentId,\n error: 'Summarization produced empty output',\n } satisfies t.SummarizeCompleteEvent,\n runnableConfig\n );\n }\n return { summarizationRequest: undefined };\n }\n\n const summaryText = enrichSummary(rawText, messagesToRefine);\n\n const tokenCount = computeSummaryTokenCount(\n summaryText,\n summaryUsage,\n agentContext.tokenCounter\n );\n\n agentContext.setSummary(summaryText, tokenCount);\n\n log('info', 'Summary persisted');\n log('debug', 'Summary details', {\n summaryTokens: tokenCount,\n textLength: summaryText.length,\n messagesCompacted: messagesToRefine.length,\n summaryVersion: agentContext.summaryVersion,\n ...(summaryUsage != null\n ? {\n input_tokens: summaryUsage.input_tokens,\n output_tokens: summaryUsage.output_tokens,\n cache_read: summaryUsage.input_token_details?.cache_read,\n cache_creation: summaryUsage.input_token_details?.cache_creation,\n }\n : {}),\n });\n\n const summaryBlock = buildSummaryBlock({\n summaryText,\n tokenCount,\n stepId,\n stepIndex: runStep.index,\n modelName: clientConfig.modelName,\n provider: clientConfig.provider,\n summaryVersion: agentContext.summaryVersion,\n });\n\n await dispatchCompletionEvents({\n graph,\n runnableConfig,\n stepId,\n summaryBlock,\n agentContext,\n runStep,\n summaryUsage,\n agentId: request.agentId,\n });\n\n return {\n summarizationRequest: undefined,\n messages: [createRemoveAllMessage()],\n };\n };\n}\n\n/** Extracts text from an LLM response, skipping reasoning/thinking blocks. */\nfunction extractResponseText(response: { content: string | object }): string {\n const { content } = response;\n if (typeof content === 'string') {\n return content.trim();\n }\n if (!Array.isArray(content)) {\n return '';\n }\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === 'string') {\n parts.push(block);\n continue;\n }\n if (block == null || typeof block !== 'object') {\n continue;\n }\n const rec = block as Record<string, unknown>;\n if (\n rec.type === ContentTypes.THINKING ||\n rec.type === ContentTypes.REASONING_CONTENT ||\n rec.type === 'redacted_thinking'\n ) {\n continue;\n }\n if (rec.type === 'text' && typeof rec.text === 'string') {\n parts.push(rec.text);\n }\n }\n return parts.join('').trim();\n}\n\nfunction buildSummarizationInstruction(\n promptText: string,\n updatePromptText: string | undefined,\n priorSummaryText: string\n): string {\n const effectivePrompt = priorSummaryText\n ? (updatePromptText ?? promptText)\n : promptText;\n const parts = [effectivePrompt];\n if (priorSummaryText) {\n parts.push(\n `\\n\\n<previous-summary>\\n${priorSummaryText}\\n</previous-summary>`\n );\n }\n return parts.join('');\n}\n\n/** Creates an `onChunk` callback that dispatches `ON_SUMMARIZE_DELTA` events for streaming. */\nfunction createSummarizationChunkHandler({\n stepId,\n config,\n provider,\n reasoningKey = 'reasoning_content',\n}: {\n stepId?: string;\n config?: RunnableConfig;\n provider?: Providers;\n reasoningKey?: 'reasoning_content' | 'reasoning';\n}): OnChunk | undefined {\n if (stepId == null || stepId === '' || !config) {\n return undefined;\n }\n return (chunk) => {\n const chunkAny = chunk as Parameters<typeof getChunkContent>[0]['chunk'];\n const raw = getChunkContent({ chunk: chunkAny, provider, reasoningKey });\n if (raw == null || (typeof raw === 'string' && !raw)) {\n return;\n }\n const contentBlocks: t.MessageContentComplex[] =\n typeof raw === 'string'\n ? [{ type: ContentTypes.TEXT, text: raw } as t.MessageContentComplex]\n : raw;\n\n safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_DELTA,\n {\n id: stepId,\n delta: {\n summary: {\n type: ContentTypes.SUMMARY,\n content: contentBlocks,\n provider: String(config.metadata?.summarization_provider ?? ''),\n model: String(config.metadata?.summarization_model ?? ''),\n },\n },\n } satisfies t.SummarizeDeltaEvent,\n config\n );\n };\n}\n\nfunction traceConfig(\n config: RunnableConfig | undefined,\n stage: string\n): RunnableConfig | undefined {\n if (!config) {\n return undefined;\n }\n return {\n ...config,\n runName: `summarization:${stage}`,\n metadata: { ...config.metadata, summarization: true, stage },\n };\n}\n\n/**\n * Cache-friendly compaction: sends raw conversation messages with the\n * summarization instruction appended as the final HumanMessage.\n * Providers with prompt caching get a cache hit on the system prompt +\n * tool definitions prefix.\n */\nasync function summarizeWithCacheHit({\n model,\n messages,\n promptText,\n updatePromptText,\n priorSummaryText,\n config,\n stepId,\n provider,\n reasoningKey,\n usePromptCache,\n log,\n}: {\n model: t.ChatModel;\n messages: BaseMessage[];\n promptText: string;\n updatePromptText?: string;\n priorSummaryText: string;\n config?: RunnableConfig;\n stepId?: string;\n provider: Providers;\n reasoningKey?: 'reasoning_content' | 'reasoning';\n usePromptCache?: boolean;\n log?: LogFn;\n}): Promise<{ text: string; usage?: Partial<UsageMetadata> }> {\n const instruction = buildSummarizationInstruction(\n promptText,\n updatePromptText,\n priorSummaryText\n );\n\n const fullMessages = [...messages, new HumanMessage(instruction)];\n const invokeMessages =\n usePromptCache === true ? addCacheControl(fullMessages) : fullMessages;\n\n const result = await attemptInvoke(\n {\n model,\n messages: invokeMessages,\n provider,\n onChunk: createSummarizationChunkHandler({\n stepId,\n config: traceConfig(config, 'cache_hit_compaction'),\n provider,\n reasoningKey,\n }),\n },\n traceConfig(config, 'cache_hit_compaction')\n );\n\n const responseMsg = result.messages?.[0];\n const text = responseMsg\n ? extractResponseText(responseMsg as { content: string | object })\n : '';\n let usage: Partial<UsageMetadata> | undefined;\n let usageSource = 'none';\n if (\n responseMsg != null &&\n 'usage_metadata' in responseMsg &&\n responseMsg.usage_metadata != null\n ) {\n usage = responseMsg.usage_metadata as Partial<UsageMetadata>;\n usageSource = 'usage_metadata';\n } else if (responseMsg != null) {\n const respMeta = responseMsg.response_metadata as\n | Record<string, unknown>\n | undefined;\n const raw = (respMeta?.metadata as Record<string, unknown> | undefined)\n ?.usage as Record<string, unknown> | undefined;\n if (raw != null) {\n usage = {\n input_tokens: Number(raw.inputTokens) || undefined,\n output_tokens: Number(raw.outputTokens) || undefined,\n } as Partial<UsageMetadata>;\n usageSource = 'response_metadata';\n }\n }\n const cacheDetails = (\n usage as\n | {\n input_token_details?: {\n cache_read?: number;\n cache_creation?: number;\n };\n }\n | undefined\n )?.input_token_details;\n log?.('debug', 'Summarization LLM usage', {\n source: usageSource,\n input_tokens: usage?.input_tokens,\n output_tokens: usage?.output_tokens,\n ...(cacheDetails?.cache_read != null || cacheDetails?.cache_creation != null\n ? {\n 'input_token_details.cache_read': cacheDetails.cache_read,\n 'input_token_details.cache_creation': cacheDetails.cache_creation,\n }\n : {}),\n });\n return { text, usage };\n}\n"],"names":["messages","AIMessage","ToolMessage","getMaxOutputTokensKey","SystemMessage","ContentTypes","initializeModel","tryFallbackProviders","HumanMessage","safeDispatchCustomEvent","GraphEvents","emitAgentLog","StepTypes","createRemoveAllMessage","getChunkContent","addCacheControl","attemptInvoke"],"mappings":"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"}
@@ -19,7 +19,7 @@ const SUMMARY_WRAPPER_OVERHEAD_TOKENS = 33;
19
19
  /** Structured checkpoint prompt for fresh summarization (no prior summary). */
20
20
  const DEFAULT_SUMMARIZATION_PROMPT = `Hold on, before you continue I need you to write me a checkpoint of everything so far. Your context window is filling up and this checkpoint replaces the messages above, so capture everything you need to pick right back up.
21
21
 
22
- Don't second-guess or fact-check anything you did, your tool results reflect exactly what happened. Just record what you did and what you observed. Only the checkpoint, don't respond to me or continue the conversation.
22
+ Don't second-guess or fact-check anything you did, your tool results reflect exactly what happened. If a tool result appears truncated, that's just a display artifact from context management: the tool executed fully. Just record what you did and what you observed. Only the checkpoint, don't respond to me or continue the conversation.
23
23
 
24
24
  ## Checkpoint
25
25
 
@@ -56,7 +56,7 @@ const DEFAULT_UPDATE_SUMMARIZATION_PROMPT = `Hold on again, update your checkpoi
56
56
 
57
57
  Keep it roughly the same length as your last checkpoint. Compress older details to make room for what's new, don't just append. Give recent actions more detail, compress older items to one-liners.
58
58
 
59
- Don't fact-check or second-guess anything, your tool results are ground truth. Only the checkpoint, don't respond to me or continue the conversation.
59
+ Don't fact-check or second-guess anything, your tool results are ground truth. If a tool result appears truncated, that's just a display artifact: the tool executed fully. Only the checkpoint, don't respond to me or continue the conversation.
60
60
 
61
61
  Rules:
62
62
  - Merge new progress into existing sections, don't duplicate headers
@@ -1 +1 @@
1
- {"version":3,"file":"node.mjs","sources":["../../../src/summarization/node.ts"],"sourcesContent":["import {\n AIMessage,\n ToolMessage,\n HumanMessage,\n SystemMessage,\n} from '@langchain/core/messages';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type { UsageMetadata, BaseMessage } from '@langchain/core/messages';\nimport type { AgentContext } from '@/agents/AgentContext';\nimport type { OnChunk } from '@/llm/invoke';\nimport type * as t from '@/types';\nimport { ContentTypes, GraphEvents, StepTypes, Providers } from '@/common';\nimport { safeDispatchCustomEvent, emitAgentLog } from '@/utils/events';\nimport { attemptInvoke, tryFallbackProviders } from '@/llm/invoke';\nimport { createRemoveAllMessage } from '@/messages/reducer';\nimport { getMaxOutputTokensKey } from '@/llm/request';\nimport { addCacheControl } from '@/messages/cache';\nimport { initializeModel } from '@/llm/init';\nimport { getChunkContent } from '@/stream';\n\nconst SUMMARIZATION_PARAM_KEYS = new Set(['maxSummaryTokens']);\n\n/**\n * Token overhead of the XML wrapper + instruction text added around the\n * summary at injection time in AgentContext.buildSystemRunnable:\n * `<summary>\\n${text}\\n</summary>\\n\\nYour context window was compacted...`\n * ~33 tokens on Anthropic, ~24-27 on OpenAI. Using 33 as a safe ceiling.\n */\nconst SUMMARY_WRAPPER_OVERHEAD_TOKENS = 33;\n\n/** Structured checkpoint prompt for fresh summarization (no prior summary). */\nexport const DEFAULT_SUMMARIZATION_PROMPT = `Hold on, before you continue I need you to write me a checkpoint of everything so far. Your context window is filling up and this checkpoint replaces the messages above, so capture everything you need to pick right back up.\n\nDon't second-guess or fact-check anything you did, your tool results reflect exactly what happened. Just record what you did and what you observed. Only the checkpoint, don't respond to me or continue the conversation.\n\n## Checkpoint\n\n## Goal\nWhat I asked you to do and any sub-goals you identified.\n\n## Constraints & Preferences\nAny rules, preferences, or configuration I established.\n\n## Progress\n### Done\n- What you completed and the outcomes\n\n### In Progress\n- What you're currently working on\n\n## Key Decisions\nDecisions you made and why.\n\n## Next Steps\nConcrete task actions remaining, in priority order.\n\n## Critical Context\nExact identifiers, names, error messages, URLs, and details you need to preserve verbatim.\n\nRules:\n- Record what you did and observed, don't judge or re-evaluate it\n- For each tool call: the tool name, key inputs, and the outcome\n- Preserve exact identifiers, names, errors, and references verbatim\n- Short declarative sentences\n- Skip empty sections`;\n\n/** Prompt for re-compaction when a prior summary exists. */\nexport const DEFAULT_UPDATE_SUMMARIZATION_PROMPT = `Hold on again, update your checkpoint. Merge the new messages into your existing checkpoint and give me a single consolidated replacement.\n\nKeep it roughly the same length as your last checkpoint. Compress older details to make room for what's new, don't just append. Give recent actions more detail, compress older items to one-liners.\n\nDon't fact-check or second-guess anything, your tool results are ground truth. Only the checkpoint, don't respond to me or continue the conversation.\n\nRules:\n- Merge new progress into existing sections, don't duplicate headers\n- Compress older completed items into one-line entries\n- Move items from \"In Progress\" to \"Done\" when you completed them\n- Update \"Next Steps\" to reflect current task priorities.\n- For each new tool call: the tool name, key inputs, and the outcome\n- Preserve exact identifiers, names, errors, and references verbatim\n- Skip empty sections`;\n\nfunction separateParameters(parameters: Record<string, unknown>): {\n llmParams: Record<string, unknown>;\n maxSummaryTokens?: number;\n} {\n const llmParams: Record<string, unknown> = {};\n let maxSummaryTokens: number | undefined;\n\n for (const [key, value] of Object.entries(parameters)) {\n if (SUMMARIZATION_PARAM_KEYS.has(key)) {\n if (\n key === 'maxSummaryTokens' &&\n typeof value === 'number' &&\n value > 0\n ) {\n maxSummaryTokens = value;\n }\n } else {\n llmParams[key] = value;\n }\n }\n\n return { llmParams, maxSummaryTokens };\n}\n\n/**\n * Generates a structural metadata summary without making an LLM call.\n * Used as a last-resort fallback when all summarization attempts fail.\n * Preserves tool names and message counts so the agent retains basic context.\n */\nfunction generateMetadataStub(messages: BaseMessage[]): string {\n const counts: Record<string, number> = {};\n const toolNames = new Set<string>();\n\n for (const msg of messages) {\n const role = msg.getType();\n counts[role] = (counts[role] ?? 0) + 1;\n\n if (role === 'tool' && msg.name != null && msg.name !== '') {\n toolNames.add(msg.name);\n }\n\n if (\n role === 'ai' &&\n msg instanceof AIMessage &&\n msg.tool_calls &&\n msg.tool_calls.length > 0\n ) {\n for (const tc of msg.tool_calls) {\n toolNames.add(tc.name);\n }\n }\n }\n\n const countParts = Object.entries(counts)\n .map(([role, count]) => `${count} ${role}`)\n .join(', ');\n\n const lines = [\n `[Metadata summary: ${messages.length} messages (${countParts})]`,\n ];\n\n if (toolNames.size > 0) {\n lines.push(`[Tools used: ${Array.from(toolNames).join(', ')}]`);\n }\n\n return lines.join('\\n');\n}\n\n/** Maximum number of tool failures to include in the enrichment section. */\nconst MAX_TOOL_FAILURES = 8;\n/** Maximum chars per failure summary line. */\nconst MAX_TOOL_FAILURE_CHARS = 240;\n\n/**\n * Extracts failed tool results from messages and formats them as a structured\n * section. LLMs often omit specific failure details (exit codes, error messages)\n * from their summaries, this mechanical enrichment guarantees they survive.\n */\nfunction extractToolFailuresSection(messages: BaseMessage[]): string {\n const failures: Array<{ toolName: string; summary: string }> = [];\n const seen = new Set<string>();\n\n for (const msg of messages) {\n if (msg.getType() !== 'tool') {\n continue;\n }\n const toolMsg = msg as ToolMessage;\n if (toolMsg.status !== 'error') {\n continue;\n }\n // Deduplicate by tool_call_id\n const callId = toolMsg.tool_call_id;\n if (callId && seen.has(callId)) {\n continue;\n }\n if (callId) {\n seen.add(callId);\n }\n\n const toolName = toolMsg.name ?? 'tool';\n const content =\n typeof toolMsg.content === 'string'\n ? toolMsg.content\n : JSON.stringify(toolMsg.content);\n const normalized = content.replace(/\\s+/g, ' ').trim();\n const summary =\n normalized.length > MAX_TOOL_FAILURE_CHARS\n ? `${normalized.slice(0, MAX_TOOL_FAILURE_CHARS - 3)}...`\n : normalized;\n\n failures.push({ toolName, summary });\n }\n\n if (failures.length === 0) {\n return '';\n }\n\n const lines = failures\n .slice(0, MAX_TOOL_FAILURES)\n .map((f) => `- ${f.toolName}: ${f.summary}`);\n if (failures.length > MAX_TOOL_FAILURES) {\n lines.push(`- ...and ${failures.length - MAX_TOOL_FAILURES} more`);\n }\n\n return `\\n\\n## Tool Failures\\n${lines.join('\\n')}`;\n}\n\n/**\n * Appends mechanical enrichment sections to an LLM-generated summary.\n * Tool failures are appended verbatim because LLMs often omit specific\n * error details from their summaries.\n */\nfunction enrichSummary(summaryText: string, messages: BaseMessage[]): string {\n return summaryText + extractToolFailuresSection(messages);\n}\n\n/**\n * Restores pre-masking tool content onto the messages array using\n * `pendingOriginalToolContent` stored on AgentContext. Only allocates\n * a new array when there are entries to restore; otherwise returns the\n * input reference unchanged.\n */\nfunction restoreOriginalToolContent(\n messages: BaseMessage[],\n originalToolContent: Map<number, string> | undefined\n): BaseMessage[] {\n if (originalToolContent == null || originalToolContent.size === 0) {\n return messages;\n }\n const restored = [...messages];\n for (const [idx, content] of originalToolContent) {\n const msg = restored[idx];\n if (msg instanceof ToolMessage) {\n restored[idx] = new ToolMessage({\n content,\n tool_call_id: msg.tool_call_id,\n name: msg.name,\n id: msg.id,\n additional_kwargs: msg.additional_kwargs,\n response_metadata: msg.response_metadata,\n });\n }\n }\n return restored;\n}\n\n// ---------------------------------------------------------------------------\n// Extracted helpers for createSummarizeNode\n// ---------------------------------------------------------------------------\n\ninterface SummarizationClientConfig {\n provider: string;\n modelName?: string;\n clientOptions: Record<string, unknown>;\n effectiveMaxSummaryTokens?: number;\n promptText: string;\n updatePromptText: string;\n}\n\n/** Assembles the summarization model's client options from agent and config. */\nfunction buildSummarizationClientConfig(\n agentContext: AgentContext,\n summarizationConfig?: t.SummarizationConfig\n): SummarizationClientConfig {\n const provider = (summarizationConfig?.provider ??\n agentContext.provider) as string;\n const modelName = summarizationConfig?.model;\n const parameters = summarizationConfig?.parameters ?? {};\n const promptText =\n summarizationConfig?.prompt ?? DEFAULT_SUMMARIZATION_PROMPT;\n const updatePromptText =\n summarizationConfig?.updatePrompt ?? DEFAULT_UPDATE_SUMMARIZATION_PROMPT;\n\n const { llmParams, maxSummaryTokens: paramMaxSummaryTokens } =\n separateParameters(parameters);\n\n const isSelfSummarize = provider === (agentContext.provider as string);\n const baseOptions =\n isSelfSummarize && agentContext.clientOptions\n ? { ...agentContext.clientOptions }\n : {};\n\n const clientOptions: Record<string, unknown> = {\n ...baseOptions,\n ...llmParams,\n };\n\n if (modelName != null && modelName !== '') {\n clientOptions.model = modelName;\n clientOptions.modelName = modelName;\n }\n\n const effectiveMaxSummaryTokens =\n paramMaxSummaryTokens ?? summarizationConfig?.maxSummaryTokens;\n\n if (effectiveMaxSummaryTokens != null) {\n clientOptions[getMaxOutputTokensKey(provider)] = effectiveMaxSummaryTokens;\n }\n\n return {\n provider,\n modelName,\n clientOptions,\n effectiveMaxSummaryTokens,\n promptText,\n updatePromptText,\n };\n}\n\n/** Computes the token count for a summary, preferring provider output tokens when available. */\nfunction computeSummaryTokenCount(\n summaryText: string,\n summaryUsage: Partial<UsageMetadata> | undefined,\n tokenCounter?: (message: BaseMessage) => number\n): number {\n const providerOutputTokens = Number(summaryUsage?.output_tokens) || 0;\n if (providerOutputTokens > 0) {\n return providerOutputTokens + SUMMARY_WRAPPER_OVERHEAD_TOKENS;\n }\n if (tokenCounter) {\n return (\n tokenCounter(new SystemMessage(summaryText)) +\n SUMMARY_WRAPPER_OVERHEAD_TOKENS\n );\n }\n return 0;\n}\n\n/** Constructs the SummaryContentBlock persisted in the run step and dispatched to events. */\nfunction buildSummaryBlock(params: {\n summaryText: string;\n tokenCount: number;\n stepId: string;\n stepIndex: number;\n modelName?: string;\n provider: string;\n summaryVersion: number;\n}): t.SummaryContentBlock {\n return {\n type: ContentTypes.SUMMARY,\n content: [\n {\n type: ContentTypes.TEXT,\n text: params.summaryText,\n } as t.MessageContentComplex,\n ],\n tokenCount: params.tokenCount,\n summaryVersion: params.summaryVersion,\n boundary: {\n messageId: params.stepId,\n contentIndex: params.stepIndex,\n },\n model: params.modelName,\n provider: params.provider,\n createdAt: new Date().toISOString(),\n };\n}\n\ntype LogFn = (\n level: 'debug' | 'info' | 'warn' | 'error',\n message: string,\n data?: Record<string, unknown>\n) => void;\n\n/**\n * Runs the summarization LLM call with primary + fallback providers,\n * falling back to a metadata stub when all calls fail.\n */\nasync function executeSummarizationWithFallback(params: {\n agentContext: AgentContext;\n messages: BaseMessage[];\n clientConfig: SummarizationClientConfig;\n summarizeConfig?: RunnableConfig;\n stepId: string;\n usePromptCache: boolean;\n log: LogFn;\n}): Promise<{ text: string; usage?: Partial<UsageMetadata> }> {\n const {\n agentContext,\n messages,\n clientConfig,\n summarizeConfig,\n stepId,\n usePromptCache,\n log,\n } = params;\n\n const summarizationModel = initializeModel({\n provider: clientConfig.provider as Providers,\n clientOptions: clientConfig.clientOptions as t.ClientOptions,\n tools: agentContext.getToolsForBinding(),\n }) as t.ChatModel;\n\n const priorSummaryText = agentContext.getSummaryText()?.trim() ?? '';\n\n let summaryText = '';\n let summaryUsage: Partial<UsageMetadata> | undefined;\n\n try {\n const result = await summarizeWithCacheHit({\n model: summarizationModel,\n messages,\n promptText: clientConfig.promptText,\n updatePromptText: clientConfig.updatePromptText,\n priorSummaryText,\n config: summarizeConfig,\n stepId,\n provider: clientConfig.provider as Providers,\n reasoningKey: agentContext.reasoningKey,\n usePromptCache,\n log,\n });\n summaryText = result.text;\n summaryUsage = result.usage;\n } catch (primaryError) {\n log('error', 'Summarization LLM call failed', {\n error:\n primaryError instanceof Error\n ? primaryError.message\n : String(primaryError),\n provider: clientConfig.provider,\n model: clientConfig.modelName,\n messagesToRefineCount: messages.length,\n });\n\n const fallbacks =\n (clientConfig.clientOptions as unknown as t.LLMConfig | undefined)\n ?.fallbacks ?? [];\n if (fallbacks.length > 0) {\n try {\n const onChunk = createSummarizationChunkHandler({\n stepId,\n config: traceConfig(summarizeConfig, 'cache_hit_compaction'),\n provider: clientConfig.provider as Providers,\n reasoningKey: agentContext.reasoningKey,\n });\n const fbResult = await tryFallbackProviders({\n fallbacks,\n tools: agentContext.getToolsForBinding(),\n messages: [\n ...messages,\n new HumanMessage(\n buildSummarizationInstruction(\n clientConfig.promptText,\n clientConfig.updatePromptText,\n priorSummaryText\n )\n ),\n ],\n config: traceConfig(summarizeConfig, 'cache_hit_compaction'),\n primaryError,\n onChunk,\n });\n const fbMsg = fbResult?.messages?.[0];\n if (fbMsg) {\n summaryText = extractResponseText(\n fbMsg as { content: string | object }\n );\n }\n } catch (fbErr) {\n log('warn', 'Fallback providers also failed', {\n error: fbErr instanceof Error ? fbErr.message : String(fbErr),\n });\n }\n }\n if (!summaryText) {\n log('warn', 'Summarization failed, falling back to metadata stub', {\n error:\n primaryError instanceof Error\n ? primaryError.message\n : String(primaryError),\n });\n summaryText = generateMetadataStub(messages);\n }\n }\n\n return { text: summaryText, usage: summaryUsage };\n}\n\n/** Dispatches run step completion, ON_SUMMARIZE_COMPLETE, and rebuilds token map. */\nasync function dispatchCompletionEvents(params: {\n graph: CreateSummarizeNodeParams['graph'];\n runnableConfig?: RunnableConfig;\n stepId: string;\n summaryBlock: t.SummaryContentBlock;\n agentContext: AgentContext;\n runStep: t.RunStep;\n summaryUsage?: Partial<UsageMetadata>;\n agentId: string;\n}): Promise<void> {\n const {\n graph,\n runnableConfig,\n stepId,\n summaryBlock,\n agentContext,\n runStep,\n summaryUsage,\n agentId,\n } = params;\n\n runStep.summary = summaryBlock;\n if (summaryUsage) {\n runStep.usage = {\n prompt_tokens: Number(summaryUsage.input_tokens) || 0,\n completion_tokens: Number(summaryUsage.output_tokens) || 0,\n total_tokens:\n (Number(summaryUsage.input_tokens) || 0) +\n (Number(summaryUsage.output_tokens) || 0),\n };\n }\n\n await graph.dispatchRunStepCompleted(\n stepId,\n { type: 'summary', summary: summaryBlock } satisfies t.SummaryCompleted,\n runnableConfig\n );\n\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_COMPLETE,\n {\n id: stepId,\n agentId,\n summary: summaryBlock,\n } satisfies t.SummarizeCompleteEvent,\n runnableConfig\n );\n }\n\n agentContext.rebuildTokenMapAfterSummarization({});\n}\n\n// ---------------------------------------------------------------------------\n// createSummarizeNode\n// ---------------------------------------------------------------------------\n\ninterface CreateSummarizeNodeParams {\n agentContext: AgentContext;\n graph: {\n contentData: t.RunStep[];\n contentIndexMap: Map<string, number>;\n config?: RunnableConfig;\n runId?: string;\n isMultiAgent: boolean;\n dispatchRunStep: (\n runStep: t.RunStep,\n config?: RunnableConfig\n ) => Promise<void>;\n dispatchRunStepCompleted: (\n stepId: string,\n result: t.StepCompleted,\n config?: RunnableConfig\n ) => Promise<void>;\n };\n generateStepId: (stepKey: string) => [string, number];\n}\n\nexport function createSummarizeNode({\n agentContext,\n graph,\n generateStepId,\n}: CreateSummarizeNodeParams) {\n return async (\n state: {\n messages: BaseMessage[];\n summarizationRequest?: t.SummarizationNodeInput;\n },\n config?: RunnableConfig\n ): Promise<{ summarizationRequest: undefined; messages?: BaseMessage[] }> => {\n const request = state.summarizationRequest;\n if (request == null) {\n return { summarizationRequest: undefined };\n }\n\n const maxCtx = agentContext.maxContextTokens ?? 0;\n if (maxCtx > 0 && agentContext.instructionTokens >= maxCtx) {\n emitAgentLog(\n config,\n 'warn',\n 'summarize',\n 'Summarization skipped, instructions exceed context budget. Reduce the number of tools or increase maxContextTokens.',\n {\n instructionTokens: agentContext.instructionTokens,\n maxContextTokens: maxCtx,\n breakdown: agentContext.formatTokenBudgetBreakdown(),\n },\n { runId: graph.runId, agentId: request.agentId }\n );\n return { summarizationRequest: undefined };\n }\n\n const messagesToRefine = restoreOriginalToolContent(\n state.messages,\n agentContext.pendingOriginalToolContent\n );\n agentContext.pendingOriginalToolContent = undefined;\n\n const clientConfig = buildSummarizationClientConfig(\n agentContext,\n agentContext.summarizationConfig\n );\n\n const runnableConfig = config ?? graph.config;\n\n const stepKey = `summarize-${request.agentId}`;\n const [stepId, stepIndex] = generateStepId(stepKey);\n\n const placeholderSummary: t.SummaryContentBlock = {\n type: ContentTypes.SUMMARY,\n model: clientConfig.modelName,\n provider: clientConfig.provider,\n };\n\n const runStep: t.RunStep = {\n stepIndex,\n id: stepId,\n type: StepTypes.MESSAGE_CREATION,\n index: graph.contentData.length,\n stepDetails: {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: { message_id: stepId },\n },\n summary: placeholderSummary,\n usage: null,\n };\n\n if (graph.runId != null && graph.runId !== '') {\n runStep.runId = graph.runId;\n }\n if (graph.isMultiAgent && agentContext.agentId) {\n runStep.agentId = agentContext.agentId;\n }\n\n await graph.dispatchRunStep(runStep, runnableConfig);\n\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_START,\n {\n agentId: request.agentId,\n provider: clientConfig.provider,\n model: clientConfig.modelName,\n messagesToRefineCount: messagesToRefine.length,\n summaryVersion: agentContext.summaryVersion + 1,\n } satisfies t.SummarizeStartEvent,\n runnableConfig\n );\n }\n\n const isSelfSummarizeModel =\n clientConfig.provider === (agentContext.provider as string);\n const hasPromptCache =\n isSelfSummarizeModel &&\n (agentContext.clientOptions as Record<string, unknown> | undefined)\n ?.promptCache === true;\n\n const log: LogFn = (level, message, data) => {\n emitAgentLog(runnableConfig, level, 'summarize', message, data, {\n runId: graph.runId,\n agentId: request.agentId,\n });\n };\n\n log('debug', 'Summarization starting', {\n messagesToRefineCount: messagesToRefine.length,\n hasPriorSummary: (agentContext.getSummaryText()?.trim() ?? '') !== '',\n summaryVersion: agentContext.summaryVersion + 1,\n isSelfSummarize: isSelfSummarizeModel,\n hasPromptCache,\n provider: clientConfig.provider,\n });\n\n const summarizeConfig: RunnableConfig | undefined = config\n ? {\n ...config,\n metadata: {\n ...config.metadata,\n agent_id: request.agentId,\n summarization_provider: clientConfig.provider,\n summarization_model: clientConfig.modelName,\n },\n }\n : undefined;\n\n const { text: rawText, usage: summaryUsage } =\n await executeSummarizationWithFallback({\n agentContext,\n messages: messagesToRefine,\n clientConfig,\n summarizeConfig,\n stepId,\n usePromptCache: isSelfSummarizeModel && hasPromptCache,\n log,\n });\n\n if (!rawText) {\n agentContext.markSummarizationTriggered(0);\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_COMPLETE,\n {\n id: stepId,\n agentId: request.agentId,\n error: 'Summarization produced empty output',\n } satisfies t.SummarizeCompleteEvent,\n runnableConfig\n );\n }\n return { summarizationRequest: undefined };\n }\n\n const summaryText = enrichSummary(rawText, messagesToRefine);\n\n const tokenCount = computeSummaryTokenCount(\n summaryText,\n summaryUsage,\n agentContext.tokenCounter\n );\n\n agentContext.setSummary(summaryText, tokenCount);\n\n log('info', 'Summary persisted');\n log('debug', 'Summary details', {\n summaryTokens: tokenCount,\n textLength: summaryText.length,\n messagesCompacted: messagesToRefine.length,\n summaryVersion: agentContext.summaryVersion,\n ...(summaryUsage != null\n ? {\n input_tokens: summaryUsage.input_tokens,\n output_tokens: summaryUsage.output_tokens,\n cache_read: summaryUsage.input_token_details?.cache_read,\n cache_creation: summaryUsage.input_token_details?.cache_creation,\n }\n : {}),\n });\n\n const summaryBlock = buildSummaryBlock({\n summaryText,\n tokenCount,\n stepId,\n stepIndex: runStep.index,\n modelName: clientConfig.modelName,\n provider: clientConfig.provider,\n summaryVersion: agentContext.summaryVersion,\n });\n\n await dispatchCompletionEvents({\n graph,\n runnableConfig,\n stepId,\n summaryBlock,\n agentContext,\n runStep,\n summaryUsage,\n agentId: request.agentId,\n });\n\n return {\n summarizationRequest: undefined,\n messages: [createRemoveAllMessage()],\n };\n };\n}\n\n/** Extracts text from an LLM response, skipping reasoning/thinking blocks. */\nfunction extractResponseText(response: { content: string | object }): string {\n const { content } = response;\n if (typeof content === 'string') {\n return content.trim();\n }\n if (!Array.isArray(content)) {\n return '';\n }\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === 'string') {\n parts.push(block);\n continue;\n }\n if (block == null || typeof block !== 'object') {\n continue;\n }\n const rec = block as Record<string, unknown>;\n if (\n rec.type === ContentTypes.THINKING ||\n rec.type === ContentTypes.REASONING_CONTENT ||\n rec.type === 'redacted_thinking'\n ) {\n continue;\n }\n if (rec.type === 'text' && typeof rec.text === 'string') {\n parts.push(rec.text);\n }\n }\n return parts.join('').trim();\n}\n\nfunction buildSummarizationInstruction(\n promptText: string,\n updatePromptText: string | undefined,\n priorSummaryText: string\n): string {\n const effectivePrompt = priorSummaryText\n ? (updatePromptText ?? promptText)\n : promptText;\n const parts = [effectivePrompt];\n if (priorSummaryText) {\n parts.push(\n `\\n\\n<previous-summary>\\n${priorSummaryText}\\n</previous-summary>`\n );\n }\n return parts.join('');\n}\n\n/** Creates an `onChunk` callback that dispatches `ON_SUMMARIZE_DELTA` events for streaming. */\nfunction createSummarizationChunkHandler({\n stepId,\n config,\n provider,\n reasoningKey = 'reasoning_content',\n}: {\n stepId?: string;\n config?: RunnableConfig;\n provider?: Providers;\n reasoningKey?: 'reasoning_content' | 'reasoning';\n}): OnChunk | undefined {\n if (stepId == null || stepId === '' || !config) {\n return undefined;\n }\n return (chunk) => {\n const chunkAny = chunk as Parameters<typeof getChunkContent>[0]['chunk'];\n const raw = getChunkContent({ chunk: chunkAny, provider, reasoningKey });\n if (raw == null || (typeof raw === 'string' && !raw)) {\n return;\n }\n const contentBlocks: t.MessageContentComplex[] =\n typeof raw === 'string'\n ? [{ type: ContentTypes.TEXT, text: raw } as t.MessageContentComplex]\n : raw;\n\n safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_DELTA,\n {\n id: stepId,\n delta: {\n summary: {\n type: ContentTypes.SUMMARY,\n content: contentBlocks,\n provider: String(config.metadata?.summarization_provider ?? ''),\n model: String(config.metadata?.summarization_model ?? ''),\n },\n },\n } satisfies t.SummarizeDeltaEvent,\n config\n );\n };\n}\n\nfunction traceConfig(\n config: RunnableConfig | undefined,\n stage: string\n): RunnableConfig | undefined {\n if (!config) {\n return undefined;\n }\n return {\n ...config,\n runName: `summarization:${stage}`,\n metadata: { ...config.metadata, summarization: true, stage },\n };\n}\n\n/**\n * Cache-friendly compaction: sends raw conversation messages with the\n * summarization instruction appended as the final HumanMessage.\n * Providers with prompt caching get a cache hit on the system prompt +\n * tool definitions prefix.\n */\nasync function summarizeWithCacheHit({\n model,\n messages,\n promptText,\n updatePromptText,\n priorSummaryText,\n config,\n stepId,\n provider,\n reasoningKey,\n usePromptCache,\n log,\n}: {\n model: t.ChatModel;\n messages: BaseMessage[];\n promptText: string;\n updatePromptText?: string;\n priorSummaryText: string;\n config?: RunnableConfig;\n stepId?: string;\n provider: Providers;\n reasoningKey?: 'reasoning_content' | 'reasoning';\n usePromptCache?: boolean;\n log?: LogFn;\n}): Promise<{ text: string; usage?: Partial<UsageMetadata> }> {\n const instruction = buildSummarizationInstruction(\n promptText,\n updatePromptText,\n priorSummaryText\n );\n\n const fullMessages = [...messages, new HumanMessage(instruction)];\n const invokeMessages =\n usePromptCache === true ? addCacheControl(fullMessages) : fullMessages;\n\n const result = await attemptInvoke(\n {\n model,\n messages: invokeMessages,\n provider,\n onChunk: createSummarizationChunkHandler({\n stepId,\n config: traceConfig(config, 'cache_hit_compaction'),\n provider,\n reasoningKey,\n }),\n },\n traceConfig(config, 'cache_hit_compaction')\n );\n\n const responseMsg = result.messages?.[0];\n const text = responseMsg\n ? extractResponseText(responseMsg as { content: string | object })\n : '';\n let usage: Partial<UsageMetadata> | undefined;\n let usageSource = 'none';\n if (\n responseMsg != null &&\n 'usage_metadata' in responseMsg &&\n responseMsg.usage_metadata != null\n ) {\n usage = responseMsg.usage_metadata as Partial<UsageMetadata>;\n usageSource = 'usage_metadata';\n } else if (responseMsg != null) {\n const respMeta = responseMsg.response_metadata as\n | Record<string, unknown>\n | undefined;\n const raw = (respMeta?.metadata as Record<string, unknown> | undefined)\n ?.usage as Record<string, unknown> | undefined;\n if (raw != null) {\n usage = {\n input_tokens: Number(raw.inputTokens) || undefined,\n output_tokens: Number(raw.outputTokens) || undefined,\n } as Partial<UsageMetadata>;\n usageSource = 'response_metadata';\n }\n }\n const cacheDetails = (\n usage as\n | {\n input_token_details?: {\n cache_read?: number;\n cache_creation?: number;\n };\n }\n | undefined\n )?.input_token_details;\n log?.('debug', 'Summarization LLM usage', {\n source: usageSource,\n input_tokens: usage?.input_tokens,\n output_tokens: usage?.output_tokens,\n ...(cacheDetails?.cache_read != null || cacheDetails?.cache_creation != null\n ? {\n 'input_token_details.cache_read': cacheDetails.cache_read,\n 'input_token_details.cache_creation': cacheDetails.cache_creation,\n }\n : {}),\n });\n return { text, usage };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node.mjs","sources":["../../../src/summarization/node.ts"],"sourcesContent":["import {\n AIMessage,\n ToolMessage,\n HumanMessage,\n SystemMessage,\n} from '@langchain/core/messages';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type { UsageMetadata, BaseMessage } from '@langchain/core/messages';\nimport type { AgentContext } from '@/agents/AgentContext';\nimport type { OnChunk } from '@/llm/invoke';\nimport type * as t from '@/types';\nimport { ContentTypes, GraphEvents, StepTypes, Providers } from '@/common';\nimport { safeDispatchCustomEvent, emitAgentLog } from '@/utils/events';\nimport { attemptInvoke, tryFallbackProviders } from '@/llm/invoke';\nimport { createRemoveAllMessage } from '@/messages/reducer';\nimport { getMaxOutputTokensKey } from '@/llm/request';\nimport { addCacheControl } from '@/messages/cache';\nimport { initializeModel } from '@/llm/init';\nimport { getChunkContent } from '@/stream';\n\nconst SUMMARIZATION_PARAM_KEYS = new Set(['maxSummaryTokens']);\n\n/**\n * Token overhead of the XML wrapper + instruction text added around the\n * summary at injection time in AgentContext.buildSystemRunnable:\n * `<summary>\\n${text}\\n</summary>\\n\\nYour context window was compacted...`\n * ~33 tokens on Anthropic, ~24-27 on OpenAI. Using 33 as a safe ceiling.\n */\nconst SUMMARY_WRAPPER_OVERHEAD_TOKENS = 33;\n\n/** Structured checkpoint prompt for fresh summarization (no prior summary). */\nexport const DEFAULT_SUMMARIZATION_PROMPT = `Hold on, before you continue I need you to write me a checkpoint of everything so far. Your context window is filling up and this checkpoint replaces the messages above, so capture everything you need to pick right back up.\n\nDon't second-guess or fact-check anything you did, your tool results reflect exactly what happened. If a tool result appears truncated, that's just a display artifact from context management: the tool executed fully. Just record what you did and what you observed. Only the checkpoint, don't respond to me or continue the conversation.\n\n## Checkpoint\n\n## Goal\nWhat I asked you to do and any sub-goals you identified.\n\n## Constraints & Preferences\nAny rules, preferences, or configuration I established.\n\n## Progress\n### Done\n- What you completed and the outcomes\n\n### In Progress\n- What you're currently working on\n\n## Key Decisions\nDecisions you made and why.\n\n## Next Steps\nConcrete task actions remaining, in priority order.\n\n## Critical Context\nExact identifiers, names, error messages, URLs, and details you need to preserve verbatim.\n\nRules:\n- Record what you did and observed, don't judge or re-evaluate it\n- For each tool call: the tool name, key inputs, and the outcome\n- Preserve exact identifiers, names, errors, and references verbatim\n- Short declarative sentences\n- Skip empty sections`;\n\n/** Prompt for re-compaction when a prior summary exists. */\nexport const DEFAULT_UPDATE_SUMMARIZATION_PROMPT = `Hold on again, update your checkpoint. Merge the new messages into your existing checkpoint and give me a single consolidated replacement.\n\nKeep it roughly the same length as your last checkpoint. Compress older details to make room for what's new, don't just append. Give recent actions more detail, compress older items to one-liners.\n\nDon't fact-check or second-guess anything, your tool results are ground truth. If a tool result appears truncated, that's just a display artifact: the tool executed fully. Only the checkpoint, don't respond to me or continue the conversation.\n\nRules:\n- Merge new progress into existing sections, don't duplicate headers\n- Compress older completed items into one-line entries\n- Move items from \"In Progress\" to \"Done\" when you completed them\n- Update \"Next Steps\" to reflect current task priorities.\n- For each new tool call: the tool name, key inputs, and the outcome\n- Preserve exact identifiers, names, errors, and references verbatim\n- Skip empty sections`;\n\nfunction separateParameters(parameters: Record<string, unknown>): {\n llmParams: Record<string, unknown>;\n maxSummaryTokens?: number;\n} {\n const llmParams: Record<string, unknown> = {};\n let maxSummaryTokens: number | undefined;\n\n for (const [key, value] of Object.entries(parameters)) {\n if (SUMMARIZATION_PARAM_KEYS.has(key)) {\n if (\n key === 'maxSummaryTokens' &&\n typeof value === 'number' &&\n value > 0\n ) {\n maxSummaryTokens = value;\n }\n } else {\n llmParams[key] = value;\n }\n }\n\n return { llmParams, maxSummaryTokens };\n}\n\n/**\n * Generates a structural metadata summary without making an LLM call.\n * Used as a last-resort fallback when all summarization attempts fail.\n * Preserves tool names and message counts so the agent retains basic context.\n */\nfunction generateMetadataStub(messages: BaseMessage[]): string {\n const counts: Record<string, number> = {};\n const toolNames = new Set<string>();\n\n for (const msg of messages) {\n const role = msg.getType();\n counts[role] = (counts[role] ?? 0) + 1;\n\n if (role === 'tool' && msg.name != null && msg.name !== '') {\n toolNames.add(msg.name);\n }\n\n if (\n role === 'ai' &&\n msg instanceof AIMessage &&\n msg.tool_calls &&\n msg.tool_calls.length > 0\n ) {\n for (const tc of msg.tool_calls) {\n toolNames.add(tc.name);\n }\n }\n }\n\n const countParts = Object.entries(counts)\n .map(([role, count]) => `${count} ${role}`)\n .join(', ');\n\n const lines = [\n `[Metadata summary: ${messages.length} messages (${countParts})]`,\n ];\n\n if (toolNames.size > 0) {\n lines.push(`[Tools used: ${Array.from(toolNames).join(', ')}]`);\n }\n\n return lines.join('\\n');\n}\n\n/** Maximum number of tool failures to include in the enrichment section. */\nconst MAX_TOOL_FAILURES = 8;\n/** Maximum chars per failure summary line. */\nconst MAX_TOOL_FAILURE_CHARS = 240;\n\n/**\n * Extracts failed tool results from messages and formats them as a structured\n * section. LLMs often omit specific failure details (exit codes, error messages)\n * from their summaries, this mechanical enrichment guarantees they survive.\n */\nfunction extractToolFailuresSection(messages: BaseMessage[]): string {\n const failures: Array<{ toolName: string; summary: string }> = [];\n const seen = new Set<string>();\n\n for (const msg of messages) {\n if (msg.getType() !== 'tool') {\n continue;\n }\n const toolMsg = msg as ToolMessage;\n if (toolMsg.status !== 'error') {\n continue;\n }\n // Deduplicate by tool_call_id\n const callId = toolMsg.tool_call_id;\n if (callId && seen.has(callId)) {\n continue;\n }\n if (callId) {\n seen.add(callId);\n }\n\n const toolName = toolMsg.name ?? 'tool';\n const content =\n typeof toolMsg.content === 'string'\n ? toolMsg.content\n : JSON.stringify(toolMsg.content);\n const normalized = content.replace(/\\s+/g, ' ').trim();\n const summary =\n normalized.length > MAX_TOOL_FAILURE_CHARS\n ? `${normalized.slice(0, MAX_TOOL_FAILURE_CHARS - 3)}...`\n : normalized;\n\n failures.push({ toolName, summary });\n }\n\n if (failures.length === 0) {\n return '';\n }\n\n const lines = failures\n .slice(0, MAX_TOOL_FAILURES)\n .map((f) => `- ${f.toolName}: ${f.summary}`);\n if (failures.length > MAX_TOOL_FAILURES) {\n lines.push(`- ...and ${failures.length - MAX_TOOL_FAILURES} more`);\n }\n\n return `\\n\\n## Tool Failures\\n${lines.join('\\n')}`;\n}\n\n/**\n * Appends mechanical enrichment sections to an LLM-generated summary.\n * Tool failures are appended verbatim because LLMs often omit specific\n * error details from their summaries.\n */\nfunction enrichSummary(summaryText: string, messages: BaseMessage[]): string {\n return summaryText + extractToolFailuresSection(messages);\n}\n\n/**\n * Restores pre-masking tool content onto the messages array using\n * `pendingOriginalToolContent` stored on AgentContext. Only allocates\n * a new array when there are entries to restore; otherwise returns the\n * input reference unchanged.\n */\nfunction restoreOriginalToolContent(\n messages: BaseMessage[],\n originalToolContent: Map<number, string> | undefined\n): BaseMessage[] {\n if (originalToolContent == null || originalToolContent.size === 0) {\n return messages;\n }\n const restored = [...messages];\n for (const [idx, content] of originalToolContent) {\n const msg = restored[idx];\n if (msg instanceof ToolMessage) {\n restored[idx] = new ToolMessage({\n content,\n tool_call_id: msg.tool_call_id,\n name: msg.name,\n id: msg.id,\n additional_kwargs: msg.additional_kwargs,\n response_metadata: msg.response_metadata,\n });\n }\n }\n return restored;\n}\n\n// ---------------------------------------------------------------------------\n// Extracted helpers for createSummarizeNode\n// ---------------------------------------------------------------------------\n\ninterface SummarizationClientConfig {\n provider: string;\n modelName?: string;\n clientOptions: Record<string, unknown>;\n effectiveMaxSummaryTokens?: number;\n promptText: string;\n updatePromptText: string;\n}\n\n/** Assembles the summarization model's client options from agent and config. */\nfunction buildSummarizationClientConfig(\n agentContext: AgentContext,\n summarizationConfig?: t.SummarizationConfig\n): SummarizationClientConfig {\n const provider = (summarizationConfig?.provider ??\n agentContext.provider) as string;\n const modelName = summarizationConfig?.model;\n const parameters = summarizationConfig?.parameters ?? {};\n const promptText =\n summarizationConfig?.prompt ?? DEFAULT_SUMMARIZATION_PROMPT;\n const updatePromptText =\n summarizationConfig?.updatePrompt ?? DEFAULT_UPDATE_SUMMARIZATION_PROMPT;\n\n const { llmParams, maxSummaryTokens: paramMaxSummaryTokens } =\n separateParameters(parameters);\n\n const isSelfSummarize = provider === (agentContext.provider as string);\n const baseOptions =\n isSelfSummarize && agentContext.clientOptions\n ? { ...agentContext.clientOptions }\n : {};\n\n const clientOptions: Record<string, unknown> = {\n ...baseOptions,\n ...llmParams,\n };\n\n if (modelName != null && modelName !== '') {\n clientOptions.model = modelName;\n clientOptions.modelName = modelName;\n }\n\n const effectiveMaxSummaryTokens =\n paramMaxSummaryTokens ?? summarizationConfig?.maxSummaryTokens;\n\n if (effectiveMaxSummaryTokens != null) {\n clientOptions[getMaxOutputTokensKey(provider)] = effectiveMaxSummaryTokens;\n }\n\n return {\n provider,\n modelName,\n clientOptions,\n effectiveMaxSummaryTokens,\n promptText,\n updatePromptText,\n };\n}\n\n/** Computes the token count for a summary, preferring provider output tokens when available. */\nfunction computeSummaryTokenCount(\n summaryText: string,\n summaryUsage: Partial<UsageMetadata> | undefined,\n tokenCounter?: (message: BaseMessage) => number\n): number {\n const providerOutputTokens = Number(summaryUsage?.output_tokens) || 0;\n if (providerOutputTokens > 0) {\n return providerOutputTokens + SUMMARY_WRAPPER_OVERHEAD_TOKENS;\n }\n if (tokenCounter) {\n return (\n tokenCounter(new SystemMessage(summaryText)) +\n SUMMARY_WRAPPER_OVERHEAD_TOKENS\n );\n }\n return 0;\n}\n\n/** Constructs the SummaryContentBlock persisted in the run step and dispatched to events. */\nfunction buildSummaryBlock(params: {\n summaryText: string;\n tokenCount: number;\n stepId: string;\n stepIndex: number;\n modelName?: string;\n provider: string;\n summaryVersion: number;\n}): t.SummaryContentBlock {\n return {\n type: ContentTypes.SUMMARY,\n content: [\n {\n type: ContentTypes.TEXT,\n text: params.summaryText,\n } as t.MessageContentComplex,\n ],\n tokenCount: params.tokenCount,\n summaryVersion: params.summaryVersion,\n boundary: {\n messageId: params.stepId,\n contentIndex: params.stepIndex,\n },\n model: params.modelName,\n provider: params.provider,\n createdAt: new Date().toISOString(),\n };\n}\n\ntype LogFn = (\n level: 'debug' | 'info' | 'warn' | 'error',\n message: string,\n data?: Record<string, unknown>\n) => void;\n\n/**\n * Runs the summarization LLM call with primary + fallback providers,\n * falling back to a metadata stub when all calls fail.\n */\nasync function executeSummarizationWithFallback(params: {\n agentContext: AgentContext;\n messages: BaseMessage[];\n clientConfig: SummarizationClientConfig;\n summarizeConfig?: RunnableConfig;\n stepId: string;\n usePromptCache: boolean;\n log: LogFn;\n}): Promise<{ text: string; usage?: Partial<UsageMetadata> }> {\n const {\n agentContext,\n messages,\n clientConfig,\n summarizeConfig,\n stepId,\n usePromptCache,\n log,\n } = params;\n\n const summarizationModel = initializeModel({\n provider: clientConfig.provider as Providers,\n clientOptions: clientConfig.clientOptions as t.ClientOptions,\n tools: agentContext.getToolsForBinding(),\n }) as t.ChatModel;\n\n const priorSummaryText = agentContext.getSummaryText()?.trim() ?? '';\n\n let summaryText = '';\n let summaryUsage: Partial<UsageMetadata> | undefined;\n\n try {\n const result = await summarizeWithCacheHit({\n model: summarizationModel,\n messages,\n promptText: clientConfig.promptText,\n updatePromptText: clientConfig.updatePromptText,\n priorSummaryText,\n config: summarizeConfig,\n stepId,\n provider: clientConfig.provider as Providers,\n reasoningKey: agentContext.reasoningKey,\n usePromptCache,\n log,\n });\n summaryText = result.text;\n summaryUsage = result.usage;\n } catch (primaryError) {\n log('error', 'Summarization LLM call failed', {\n error:\n primaryError instanceof Error\n ? primaryError.message\n : String(primaryError),\n provider: clientConfig.provider,\n model: clientConfig.modelName,\n messagesToRefineCount: messages.length,\n });\n\n const fallbacks =\n (clientConfig.clientOptions as unknown as t.LLMConfig | undefined)\n ?.fallbacks ?? [];\n if (fallbacks.length > 0) {\n try {\n const onChunk = createSummarizationChunkHandler({\n stepId,\n config: traceConfig(summarizeConfig, 'cache_hit_compaction'),\n provider: clientConfig.provider as Providers,\n reasoningKey: agentContext.reasoningKey,\n });\n const fbResult = await tryFallbackProviders({\n fallbacks,\n tools: agentContext.getToolsForBinding(),\n messages: [\n ...messages,\n new HumanMessage(\n buildSummarizationInstruction(\n clientConfig.promptText,\n clientConfig.updatePromptText,\n priorSummaryText\n )\n ),\n ],\n config: traceConfig(summarizeConfig, 'cache_hit_compaction'),\n primaryError,\n onChunk,\n });\n const fbMsg = fbResult?.messages?.[0];\n if (fbMsg) {\n summaryText = extractResponseText(\n fbMsg as { content: string | object }\n );\n }\n } catch (fbErr) {\n log('warn', 'Fallback providers also failed', {\n error: fbErr instanceof Error ? fbErr.message : String(fbErr),\n });\n }\n }\n if (!summaryText) {\n log('warn', 'Summarization failed, falling back to metadata stub', {\n error:\n primaryError instanceof Error\n ? primaryError.message\n : String(primaryError),\n });\n summaryText = generateMetadataStub(messages);\n }\n }\n\n return { text: summaryText, usage: summaryUsage };\n}\n\n/** Dispatches run step completion, ON_SUMMARIZE_COMPLETE, and rebuilds token map. */\nasync function dispatchCompletionEvents(params: {\n graph: CreateSummarizeNodeParams['graph'];\n runnableConfig?: RunnableConfig;\n stepId: string;\n summaryBlock: t.SummaryContentBlock;\n agentContext: AgentContext;\n runStep: t.RunStep;\n summaryUsage?: Partial<UsageMetadata>;\n agentId: string;\n}): Promise<void> {\n const {\n graph,\n runnableConfig,\n stepId,\n summaryBlock,\n agentContext,\n runStep,\n summaryUsage,\n agentId,\n } = params;\n\n runStep.summary = summaryBlock;\n if (summaryUsage) {\n runStep.usage = {\n prompt_tokens: Number(summaryUsage.input_tokens) || 0,\n completion_tokens: Number(summaryUsage.output_tokens) || 0,\n total_tokens:\n (Number(summaryUsage.input_tokens) || 0) +\n (Number(summaryUsage.output_tokens) || 0),\n };\n }\n\n await graph.dispatchRunStepCompleted(\n stepId,\n { type: 'summary', summary: summaryBlock } satisfies t.SummaryCompleted,\n runnableConfig\n );\n\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_COMPLETE,\n {\n id: stepId,\n agentId,\n summary: summaryBlock,\n } satisfies t.SummarizeCompleteEvent,\n runnableConfig\n );\n }\n\n agentContext.rebuildTokenMapAfterSummarization({});\n}\n\n// ---------------------------------------------------------------------------\n// createSummarizeNode\n// ---------------------------------------------------------------------------\n\ninterface CreateSummarizeNodeParams {\n agentContext: AgentContext;\n graph: {\n contentData: t.RunStep[];\n contentIndexMap: Map<string, number>;\n config?: RunnableConfig;\n runId?: string;\n isMultiAgent: boolean;\n dispatchRunStep: (\n runStep: t.RunStep,\n config?: RunnableConfig\n ) => Promise<void>;\n dispatchRunStepCompleted: (\n stepId: string,\n result: t.StepCompleted,\n config?: RunnableConfig\n ) => Promise<void>;\n };\n generateStepId: (stepKey: string) => [string, number];\n}\n\nexport function createSummarizeNode({\n agentContext,\n graph,\n generateStepId,\n}: CreateSummarizeNodeParams) {\n return async (\n state: {\n messages: BaseMessage[];\n summarizationRequest?: t.SummarizationNodeInput;\n },\n config?: RunnableConfig\n ): Promise<{ summarizationRequest: undefined; messages?: BaseMessage[] }> => {\n const request = state.summarizationRequest;\n if (request == null) {\n return { summarizationRequest: undefined };\n }\n\n const maxCtx = agentContext.maxContextTokens ?? 0;\n if (maxCtx > 0 && agentContext.instructionTokens >= maxCtx) {\n emitAgentLog(\n config,\n 'warn',\n 'summarize',\n 'Summarization skipped, instructions exceed context budget. Reduce the number of tools or increase maxContextTokens.',\n {\n instructionTokens: agentContext.instructionTokens,\n maxContextTokens: maxCtx,\n breakdown: agentContext.formatTokenBudgetBreakdown(),\n },\n { runId: graph.runId, agentId: request.agentId }\n );\n return { summarizationRequest: undefined };\n }\n\n const messagesToRefine = restoreOriginalToolContent(\n state.messages,\n agentContext.pendingOriginalToolContent\n );\n agentContext.pendingOriginalToolContent = undefined;\n\n const clientConfig = buildSummarizationClientConfig(\n agentContext,\n agentContext.summarizationConfig\n );\n\n const runnableConfig = config ?? graph.config;\n\n const stepKey = `summarize-${request.agentId}`;\n const [stepId, stepIndex] = generateStepId(stepKey);\n\n const placeholderSummary: t.SummaryContentBlock = {\n type: ContentTypes.SUMMARY,\n model: clientConfig.modelName,\n provider: clientConfig.provider,\n };\n\n const runStep: t.RunStep = {\n stepIndex,\n id: stepId,\n type: StepTypes.MESSAGE_CREATION,\n index: graph.contentData.length,\n stepDetails: {\n type: StepTypes.MESSAGE_CREATION,\n message_creation: { message_id: stepId },\n },\n summary: placeholderSummary,\n usage: null,\n };\n\n if (graph.runId != null && graph.runId !== '') {\n runStep.runId = graph.runId;\n }\n if (graph.isMultiAgent && agentContext.agentId) {\n runStep.agentId = agentContext.agentId;\n }\n\n await graph.dispatchRunStep(runStep, runnableConfig);\n\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_START,\n {\n agentId: request.agentId,\n provider: clientConfig.provider,\n model: clientConfig.modelName,\n messagesToRefineCount: messagesToRefine.length,\n summaryVersion: agentContext.summaryVersion + 1,\n } satisfies t.SummarizeStartEvent,\n runnableConfig\n );\n }\n\n const isSelfSummarizeModel =\n clientConfig.provider === (agentContext.provider as string);\n const hasPromptCache =\n isSelfSummarizeModel &&\n (agentContext.clientOptions as Record<string, unknown> | undefined)\n ?.promptCache === true;\n\n const log: LogFn = (level, message, data) => {\n emitAgentLog(runnableConfig, level, 'summarize', message, data, {\n runId: graph.runId,\n agentId: request.agentId,\n });\n };\n\n log('debug', 'Summarization starting', {\n messagesToRefineCount: messagesToRefine.length,\n hasPriorSummary: (agentContext.getSummaryText()?.trim() ?? '') !== '',\n summaryVersion: agentContext.summaryVersion + 1,\n isSelfSummarize: isSelfSummarizeModel,\n hasPromptCache,\n provider: clientConfig.provider,\n });\n\n const summarizeConfig: RunnableConfig | undefined = config\n ? {\n ...config,\n metadata: {\n ...config.metadata,\n agent_id: request.agentId,\n summarization_provider: clientConfig.provider,\n summarization_model: clientConfig.modelName,\n },\n }\n : undefined;\n\n const { text: rawText, usage: summaryUsage } =\n await executeSummarizationWithFallback({\n agentContext,\n messages: messagesToRefine,\n clientConfig,\n summarizeConfig,\n stepId,\n usePromptCache: isSelfSummarizeModel && hasPromptCache,\n log,\n });\n\n if (!rawText) {\n agentContext.markSummarizationTriggered(0);\n if (runnableConfig) {\n await safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_COMPLETE,\n {\n id: stepId,\n agentId: request.agentId,\n error: 'Summarization produced empty output',\n } satisfies t.SummarizeCompleteEvent,\n runnableConfig\n );\n }\n return { summarizationRequest: undefined };\n }\n\n const summaryText = enrichSummary(rawText, messagesToRefine);\n\n const tokenCount = computeSummaryTokenCount(\n summaryText,\n summaryUsage,\n agentContext.tokenCounter\n );\n\n agentContext.setSummary(summaryText, tokenCount);\n\n log('info', 'Summary persisted');\n log('debug', 'Summary details', {\n summaryTokens: tokenCount,\n textLength: summaryText.length,\n messagesCompacted: messagesToRefine.length,\n summaryVersion: agentContext.summaryVersion,\n ...(summaryUsage != null\n ? {\n input_tokens: summaryUsage.input_tokens,\n output_tokens: summaryUsage.output_tokens,\n cache_read: summaryUsage.input_token_details?.cache_read,\n cache_creation: summaryUsage.input_token_details?.cache_creation,\n }\n : {}),\n });\n\n const summaryBlock = buildSummaryBlock({\n summaryText,\n tokenCount,\n stepId,\n stepIndex: runStep.index,\n modelName: clientConfig.modelName,\n provider: clientConfig.provider,\n summaryVersion: agentContext.summaryVersion,\n });\n\n await dispatchCompletionEvents({\n graph,\n runnableConfig,\n stepId,\n summaryBlock,\n agentContext,\n runStep,\n summaryUsage,\n agentId: request.agentId,\n });\n\n return {\n summarizationRequest: undefined,\n messages: [createRemoveAllMessage()],\n };\n };\n}\n\n/** Extracts text from an LLM response, skipping reasoning/thinking blocks. */\nfunction extractResponseText(response: { content: string | object }): string {\n const { content } = response;\n if (typeof content === 'string') {\n return content.trim();\n }\n if (!Array.isArray(content)) {\n return '';\n }\n const parts: string[] = [];\n for (const block of content) {\n if (typeof block === 'string') {\n parts.push(block);\n continue;\n }\n if (block == null || typeof block !== 'object') {\n continue;\n }\n const rec = block as Record<string, unknown>;\n if (\n rec.type === ContentTypes.THINKING ||\n rec.type === ContentTypes.REASONING_CONTENT ||\n rec.type === 'redacted_thinking'\n ) {\n continue;\n }\n if (rec.type === 'text' && typeof rec.text === 'string') {\n parts.push(rec.text);\n }\n }\n return parts.join('').trim();\n}\n\nfunction buildSummarizationInstruction(\n promptText: string,\n updatePromptText: string | undefined,\n priorSummaryText: string\n): string {\n const effectivePrompt = priorSummaryText\n ? (updatePromptText ?? promptText)\n : promptText;\n const parts = [effectivePrompt];\n if (priorSummaryText) {\n parts.push(\n `\\n\\n<previous-summary>\\n${priorSummaryText}\\n</previous-summary>`\n );\n }\n return parts.join('');\n}\n\n/** Creates an `onChunk` callback that dispatches `ON_SUMMARIZE_DELTA` events for streaming. */\nfunction createSummarizationChunkHandler({\n stepId,\n config,\n provider,\n reasoningKey = 'reasoning_content',\n}: {\n stepId?: string;\n config?: RunnableConfig;\n provider?: Providers;\n reasoningKey?: 'reasoning_content' | 'reasoning';\n}): OnChunk | undefined {\n if (stepId == null || stepId === '' || !config) {\n return undefined;\n }\n return (chunk) => {\n const chunkAny = chunk as Parameters<typeof getChunkContent>[0]['chunk'];\n const raw = getChunkContent({ chunk: chunkAny, provider, reasoningKey });\n if (raw == null || (typeof raw === 'string' && !raw)) {\n return;\n }\n const contentBlocks: t.MessageContentComplex[] =\n typeof raw === 'string'\n ? [{ type: ContentTypes.TEXT, text: raw } as t.MessageContentComplex]\n : raw;\n\n safeDispatchCustomEvent(\n GraphEvents.ON_SUMMARIZE_DELTA,\n {\n id: stepId,\n delta: {\n summary: {\n type: ContentTypes.SUMMARY,\n content: contentBlocks,\n provider: String(config.metadata?.summarization_provider ?? ''),\n model: String(config.metadata?.summarization_model ?? ''),\n },\n },\n } satisfies t.SummarizeDeltaEvent,\n config\n );\n };\n}\n\nfunction traceConfig(\n config: RunnableConfig | undefined,\n stage: string\n): RunnableConfig | undefined {\n if (!config) {\n return undefined;\n }\n return {\n ...config,\n runName: `summarization:${stage}`,\n metadata: { ...config.metadata, summarization: true, stage },\n };\n}\n\n/**\n * Cache-friendly compaction: sends raw conversation messages with the\n * summarization instruction appended as the final HumanMessage.\n * Providers with prompt caching get a cache hit on the system prompt +\n * tool definitions prefix.\n */\nasync function summarizeWithCacheHit({\n model,\n messages,\n promptText,\n updatePromptText,\n priorSummaryText,\n config,\n stepId,\n provider,\n reasoningKey,\n usePromptCache,\n log,\n}: {\n model: t.ChatModel;\n messages: BaseMessage[];\n promptText: string;\n updatePromptText?: string;\n priorSummaryText: string;\n config?: RunnableConfig;\n stepId?: string;\n provider: Providers;\n reasoningKey?: 'reasoning_content' | 'reasoning';\n usePromptCache?: boolean;\n log?: LogFn;\n}): Promise<{ text: string; usage?: Partial<UsageMetadata> }> {\n const instruction = buildSummarizationInstruction(\n promptText,\n updatePromptText,\n priorSummaryText\n );\n\n const fullMessages = [...messages, new HumanMessage(instruction)];\n const invokeMessages =\n usePromptCache === true ? addCacheControl(fullMessages) : fullMessages;\n\n const result = await attemptInvoke(\n {\n model,\n messages: invokeMessages,\n provider,\n onChunk: createSummarizationChunkHandler({\n stepId,\n config: traceConfig(config, 'cache_hit_compaction'),\n provider,\n reasoningKey,\n }),\n },\n traceConfig(config, 'cache_hit_compaction')\n );\n\n const responseMsg = result.messages?.[0];\n const text = responseMsg\n ? extractResponseText(responseMsg as { content: string | object })\n : '';\n let usage: Partial<UsageMetadata> | undefined;\n let usageSource = 'none';\n if (\n responseMsg != null &&\n 'usage_metadata' in responseMsg &&\n responseMsg.usage_metadata != null\n ) {\n usage = responseMsg.usage_metadata as Partial<UsageMetadata>;\n usageSource = 'usage_metadata';\n } else if (responseMsg != null) {\n const respMeta = responseMsg.response_metadata as\n | Record<string, unknown>\n | undefined;\n const raw = (respMeta?.metadata as Record<string, unknown> | undefined)\n ?.usage as Record<string, unknown> | undefined;\n if (raw != null) {\n usage = {\n input_tokens: Number(raw.inputTokens) || undefined,\n output_tokens: Number(raw.outputTokens) || undefined,\n } as Partial<UsageMetadata>;\n usageSource = 'response_metadata';\n }\n }\n const cacheDetails = (\n usage as\n | {\n input_token_details?: {\n cache_read?: number;\n cache_creation?: number;\n };\n }\n | undefined\n )?.input_token_details;\n log?.('debug', 'Summarization LLM usage', {\n source: usageSource,\n input_tokens: usage?.input_tokens,\n output_tokens: usage?.output_tokens,\n ...(cacheDetails?.cache_read != null || cacheDetails?.cache_creation != null\n ? {\n 'input_token_details.cache_read': cacheDetails.cache_read,\n 'input_token_details.cache_creation': cacheDetails.cache_creation,\n }\n : {}),\n });\n return { text, usage };\n}\n"],"names":[],"mappings":"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"}
@@ -3,9 +3,9 @@ import type { BaseMessage } from '@langchain/core/messages';
3
3
  import type { AgentContext } from '@/agents/AgentContext';
4
4
  import type * as t from '@/types';
5
5
  /** Structured checkpoint prompt for fresh summarization (no prior summary). */
6
- export declare const DEFAULT_SUMMARIZATION_PROMPT = "Hold on, before you continue I need you to write me a checkpoint of everything so far. Your context window is filling up and this checkpoint replaces the messages above, so capture everything you need to pick right back up.\n\nDon't second-guess or fact-check anything you did, your tool results reflect exactly what happened. Just record what you did and what you observed. Only the checkpoint, don't respond to me or continue the conversation.\n\n## Checkpoint\n\n## Goal\nWhat I asked you to do and any sub-goals you identified.\n\n## Constraints & Preferences\nAny rules, preferences, or configuration I established.\n\n## Progress\n### Done\n- What you completed and the outcomes\n\n### In Progress\n- What you're currently working on\n\n## Key Decisions\nDecisions you made and why.\n\n## Next Steps\nConcrete task actions remaining, in priority order.\n\n## Critical Context\nExact identifiers, names, error messages, URLs, and details you need to preserve verbatim.\n\nRules:\n- Record what you did and observed, don't judge or re-evaluate it\n- For each tool call: the tool name, key inputs, and the outcome\n- Preserve exact identifiers, names, errors, and references verbatim\n- Short declarative sentences\n- Skip empty sections";
6
+ export declare const DEFAULT_SUMMARIZATION_PROMPT = "Hold on, before you continue I need you to write me a checkpoint of everything so far. Your context window is filling up and this checkpoint replaces the messages above, so capture everything you need to pick right back up.\n\nDon't second-guess or fact-check anything you did, your tool results reflect exactly what happened. If a tool result appears truncated, that's just a display artifact from context management: the tool executed fully. Just record what you did and what you observed. Only the checkpoint, don't respond to me or continue the conversation.\n\n## Checkpoint\n\n## Goal\nWhat I asked you to do and any sub-goals you identified.\n\n## Constraints & Preferences\nAny rules, preferences, or configuration I established.\n\n## Progress\n### Done\n- What you completed and the outcomes\n\n### In Progress\n- What you're currently working on\n\n## Key Decisions\nDecisions you made and why.\n\n## Next Steps\nConcrete task actions remaining, in priority order.\n\n## Critical Context\nExact identifiers, names, error messages, URLs, and details you need to preserve verbatim.\n\nRules:\n- Record what you did and observed, don't judge or re-evaluate it\n- For each tool call: the tool name, key inputs, and the outcome\n- Preserve exact identifiers, names, errors, and references verbatim\n- Short declarative sentences\n- Skip empty sections";
7
7
  /** Prompt for re-compaction when a prior summary exists. */
8
- export declare const DEFAULT_UPDATE_SUMMARIZATION_PROMPT = "Hold on again, update your checkpoint. Merge the new messages into your existing checkpoint and give me a single consolidated replacement.\n\nKeep it roughly the same length as your last checkpoint. Compress older details to make room for what's new, don't just append. Give recent actions more detail, compress older items to one-liners.\n\nDon't fact-check or second-guess anything, your tool results are ground truth. Only the checkpoint, don't respond to me or continue the conversation.\n\nRules:\n- Merge new progress into existing sections, don't duplicate headers\n- Compress older completed items into one-line entries\n- Move items from \"In Progress\" to \"Done\" when you completed them\n- Update \"Next Steps\" to reflect current task priorities.\n- For each new tool call: the tool name, key inputs, and the outcome\n- Preserve exact identifiers, names, errors, and references verbatim\n- Skip empty sections";
8
+ export declare const DEFAULT_UPDATE_SUMMARIZATION_PROMPT = "Hold on again, update your checkpoint. Merge the new messages into your existing checkpoint and give me a single consolidated replacement.\n\nKeep it roughly the same length as your last checkpoint. Compress older details to make room for what's new, don't just append. Give recent actions more detail, compress older items to one-liners.\n\nDon't fact-check or second-guess anything, your tool results are ground truth. If a tool result appears truncated, that's just a display artifact: the tool executed fully. Only the checkpoint, don't respond to me or continue the conversation.\n\nRules:\n- Merge new progress into existing sections, don't duplicate headers\n- Compress older completed items into one-line entries\n- Move items from \"In Progress\" to \"Done\" when you completed them\n- Update \"Next Steps\" to reflect current task priorities.\n- For each new tool call: the tool name, key inputs, and the outcome\n- Preserve exact identifiers, names, errors, and references verbatim\n- Skip empty sections";
9
9
  interface CreateSummarizeNodeParams {
10
10
  agentContext: AgentContext;
11
11
  graph: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@librechat/agents",
3
- "version": "3.1.60",
3
+ "version": "3.1.62",
4
4
  "main": "./dist/cjs/main.cjs",
5
5
  "module": "./dist/esm/main.mjs",
6
6
  "types": "./dist/types/index.d.ts",
@@ -112,13 +112,13 @@
112
112
  "@browserbasehq/stagehand": {
113
113
  "openai": "$openai"
114
114
  },
115
- "fast-xml-parser": "5.5.6",
115
+ "fast-xml-parser": "5.5.7",
116
116
  "ajv": "6.14.0",
117
117
  "minimatch": "3.1.4"
118
118
  },
119
119
  "dependencies": {
120
120
  "@anthropic-ai/sdk": "^0.73.0",
121
- "@aws-sdk/client-bedrock-runtime": "^3.980.0",
121
+ "@aws-sdk/client-bedrock-runtime": "^3.1013.0",
122
122
  "@langchain/anthropic": "^0.3.26",
123
123
  "@langchain/aws": "^0.1.15",
124
124
  "@langchain/core": "^0.3.80",
@@ -442,7 +442,7 @@ const hasAnthropic = process.env.ANTHROPIC_API_KEY != null;
442
442
  (c) => (c[0] as t.SummarizeStartEvent).agentId === startPayload.agentId
443
443
  );
444
444
  expect(startCallsForSameAgent.length).toBeGreaterThanOrEqual(1);
445
- });
445
+ }, 180_000);
446
446
 
447
447
  test('post-summary continuation over multiple turns preserves context', async () => {
448
448
  const spies = createSpies();
@@ -681,6 +681,24 @@ const hasAnthropic = process.env.ANTHROPIC_API_KEY != null;
681
681
  );
682
682
  }
683
683
 
684
+ if (spies.onSummarizeStartSpy.mock.calls.length === 0) {
685
+ run = await createRun(3000);
686
+ await runTurn(
687
+ { run, conversationHistory },
688
+ 'Compute 11 * 13 with calculator.',
689
+ streamConfig
690
+ );
691
+ }
692
+
693
+ if (spies.onSummarizeStartSpy.mock.calls.length === 0) {
694
+ run = await createRun(2800);
695
+ await runTurn(
696
+ { run, conversationHistory },
697
+ 'What is 9 * 9? Calculator.',
698
+ streamConfig
699
+ );
700
+ }
701
+
684
702
  console.log(
685
703
  ` Cross-provider summaries: ${spies.onSummarizeCompleteSpy.mock.calls.length}`
686
704
  );
@@ -708,7 +726,7 @@ const hasAnthropic = process.env.ANTHROPIC_API_KEY != null;
708
726
  console.log(
709
727
  ` Cross-provider summary (${getSummaryText(completePayload.summary).length} chars): "${getSummaryText(completePayload.summary).substring(0, 200)}…"`
710
728
  );
711
- });
729
+ }, 180_000);
712
730
 
713
731
  test('extended thinking: multi-turn with reasoning triggers summarization and grounds token accounting', async () => {
714
732
  const spies = createSpies();
@@ -965,7 +983,7 @@ const hasAnthropic = process.env.ANTHROPIC_API_KEY != null;
965
983
  expect(anthropicTokens).toBeGreaterThan(0);
966
984
  expect(localTotal).toBeGreaterThan(0);
967
985
  expect(driftPct).toBeLessThan(30);
968
- });
986
+ }, 180_000);
969
987
  });
970
988
 
971
989
  // ---------------------------------------------------------------------------
@@ -1103,7 +1121,7 @@ const hasBedrock = requiredBedrockEnv.every((k) => process.env[k] != null);
1103
1121
  );
1104
1122
  expect(postSumResult).toBeDefined();
1105
1123
  logTurn('Post-sum', conversationHistory);
1106
- });
1124
+ }, 180_000);
1107
1125
  });
1108
1126
 
1109
1127
  // ---------------------------------------------------------------------------
@@ -1270,7 +1288,7 @@ const hasOpenAI = process.env.OPENAI_API_KEY != null;
1270
1288
  ` OpenAI summary: "${getSummaryText(completePayload.summary).substring(0, 200)}…"`
1271
1289
  );
1272
1290
  console.log(` Final messages: ${conversationHistory.length}`);
1273
- });
1291
+ }, 120_000);
1274
1292
  });
1275
1293
 
1276
1294
  // ---------------------------------------------------------------------------
@@ -2495,7 +2513,7 @@ const hasAnyApiKey =
2495
2513
  ` Token audit: summary=${completePayload.summary!.tokenCount} tokens, ` +
2496
2514
  `usageEntries=${validUsage.length}`
2497
2515
  );
2498
- });
2516
+ }, 180_000);
2499
2517
 
2500
2518
  test('summary tokenCount matches local token counter', async () => {
2501
2519
  const spies = createSpies();
@@ -2600,10 +2618,9 @@ const hasAnyApiKey =
2600
2618
  const variance =
2601
2619
  Math.abs(reportedTokenCount - localTokenCount) / localTokenCount;
2602
2620
  expect(variance).toBeLessThan(0.25);
2603
- });
2621
+ }, 180_000);
2604
2622
 
2605
2623
  test('collectedUsage input_tokens decreases after summarization', async () => {
2606
- jest.setTimeout(120_000);
2607
2624
  const spies = createSpies();
2608
2625
  let collectedUsage: UsageMetadata[] = [];
2609
2626
  const conversationHistory: BaseMessage[] = [];
@@ -2731,7 +2748,7 @@ const hasAnyApiKey =
2731
2748
  ` Summarization fired: ${spies.onSummarizeCompleteSpy.mock.calls.length} times`
2732
2749
  );
2733
2750
  }
2734
- });
2751
+ }, 180_000);
2735
2752
  });
2736
2753
 
2737
2754
  // ---------------------------------------------------------------------------
@@ -31,7 +31,7 @@ const SUMMARY_WRAPPER_OVERHEAD_TOKENS = 33;
31
31
  /** Structured checkpoint prompt for fresh summarization (no prior summary). */
32
32
  export const DEFAULT_SUMMARIZATION_PROMPT = `Hold on, before you continue I need you to write me a checkpoint of everything so far. Your context window is filling up and this checkpoint replaces the messages above, so capture everything you need to pick right back up.
33
33
 
34
- Don't second-guess or fact-check anything you did, your tool results reflect exactly what happened. Just record what you did and what you observed. Only the checkpoint, don't respond to me or continue the conversation.
34
+ Don't second-guess or fact-check anything you did, your tool results reflect exactly what happened. If a tool result appears truncated, that's just a display artifact from context management: the tool executed fully. Just record what you did and what you observed. Only the checkpoint, don't respond to me or continue the conversation.
35
35
 
36
36
  ## Checkpoint
37
37
 
@@ -69,7 +69,7 @@ export const DEFAULT_UPDATE_SUMMARIZATION_PROMPT = `Hold on again, update your c
69
69
 
70
70
  Keep it roughly the same length as your last checkpoint. Compress older details to make room for what's new, don't just append. Give recent actions more detail, compress older items to one-liners.
71
71
 
72
- Don't fact-check or second-guess anything, your tool results are ground truth. Only the checkpoint, don't respond to me or continue the conversation.
72
+ Don't fact-check or second-guess anything, your tool results are ground truth. If a tool result appears truncated, that's just a display artifact: the tool executed fully. Only the checkpoint, don't respond to me or continue the conversation.
73
73
 
74
74
  Rules:
75
75
  - Merge new progress into existing sections, don't duplicate headers