161d6e4159
Extract recovery strategies and storage management: - recovery-strategy.ts, aggressive-truncation-strategy.ts - summarize-retry-strategy.ts, target-token-truncation.ts - empty-content-recovery.ts, message-builder.ts - tool-result-storage.ts, storage-paths.ts, state.ts - client.ts, tool-part-types.ts
86 lines
2.0 KiB
TypeScript
86 lines
2.0 KiB
TypeScript
import type { AggressiveTruncateResult } from "./tool-part-types"
|
|
import { findToolResultsBySize, truncateToolResult } from "./tool-result-storage"
|
|
|
|
function calculateTargetBytesToRemove(
|
|
currentTokens: number,
|
|
maxTokens: number,
|
|
targetRatio: number,
|
|
charsPerToken: number
|
|
): { tokensToReduce: number; targetBytesToRemove: number } {
|
|
const targetTokens = Math.floor(maxTokens * targetRatio)
|
|
const tokensToReduce = currentTokens - targetTokens
|
|
const targetBytesToRemove = tokensToReduce * charsPerToken
|
|
return { tokensToReduce, targetBytesToRemove }
|
|
}
|
|
|
|
export function truncateUntilTargetTokens(
|
|
sessionID: string,
|
|
currentTokens: number,
|
|
maxTokens: number,
|
|
targetRatio: number = 0.8,
|
|
charsPerToken: number = 4
|
|
): AggressiveTruncateResult {
|
|
const { tokensToReduce, targetBytesToRemove } = calculateTargetBytesToRemove(
|
|
currentTokens,
|
|
maxTokens,
|
|
targetRatio,
|
|
charsPerToken
|
|
)
|
|
|
|
if (tokensToReduce <= 0) {
|
|
return {
|
|
success: true,
|
|
sufficient: true,
|
|
truncatedCount: 0,
|
|
totalBytesRemoved: 0,
|
|
targetBytesToRemove: 0,
|
|
truncatedTools: [],
|
|
}
|
|
}
|
|
|
|
const results = findToolResultsBySize(sessionID)
|
|
|
|
if (results.length === 0) {
|
|
return {
|
|
success: false,
|
|
sufficient: false,
|
|
truncatedCount: 0,
|
|
totalBytesRemoved: 0,
|
|
targetBytesToRemove,
|
|
truncatedTools: [],
|
|
}
|
|
}
|
|
|
|
let totalRemoved = 0
|
|
let truncatedCount = 0
|
|
const truncatedTools: Array<{ toolName: string; originalSize: number }> = []
|
|
|
|
for (const result of results) {
|
|
const truncateResult = truncateToolResult(result.partPath)
|
|
if (truncateResult.success) {
|
|
truncatedCount++
|
|
const removedSize = truncateResult.originalSize ?? result.outputSize
|
|
totalRemoved += removedSize
|
|
truncatedTools.push({
|
|
toolName: truncateResult.toolName ?? result.toolName,
|
|
originalSize: removedSize,
|
|
})
|
|
|
|
if (totalRemoved >= targetBytesToRemove) {
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
const sufficient = totalRemoved >= targetBytesToRemove
|
|
|
|
return {
|
|
success: truncatedCount > 0,
|
|
sufficient,
|
|
truncatedCount,
|
|
totalBytesRemoved: totalRemoved,
|
|
targetBytesToRemove,
|
|
truncatedTools,
|
|
}
|
|
}
|