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,
|
||
|
|
}
|
||
|
|
}
|