( tracker: BudgetTracker, agentId: string | undefined, budget: number | null, globalTurnTokens: number, )
| 43 | export type TokenBudgetDecision = ContinueDecision | StopDecision |
| 44 | |
| 45 | export function checkTokenBudget( |
| 46 | tracker: BudgetTracker, |
| 47 | agentId: string | undefined, |
| 48 | budget: number | null, |
| 49 | globalTurnTokens: number, |
| 50 | ): TokenBudgetDecision { |
| 51 | if (agentId || budget === null || budget <= 0) { |
| 52 | return { action: 'stop', completionEvent: null } |
| 53 | } |
| 54 | |
| 55 | const turnTokens = globalTurnTokens |
| 56 | const pct = Math.round((turnTokens / budget) * 100) |
| 57 | const deltaSinceLastCheck = globalTurnTokens - tracker.lastGlobalTurnTokens |
| 58 | |
| 59 | const isDiminishing = |
| 60 | tracker.continuationCount >= 3 && |
| 61 | deltaSinceLastCheck < DIMINISHING_THRESHOLD && |
| 62 | tracker.lastDeltaTokens < DIMINISHING_THRESHOLD |
| 63 | |
| 64 | if (!isDiminishing && turnTokens < budget * COMPLETION_THRESHOLD) { |
| 65 | tracker.continuationCount++ |
| 66 | tracker.lastDeltaTokens = deltaSinceLastCheck |
| 67 | tracker.lastGlobalTurnTokens = globalTurnTokens |
| 68 | return { |
| 69 | action: 'continue', |
| 70 | nudgeMessage: getBudgetContinuationMessage(pct, turnTokens, budget), |
| 71 | continuationCount: tracker.continuationCount, |
| 72 | pct, |
| 73 | turnTokens, |
| 74 | budget, |
| 75 | } |
| 76 | } |
| 77 | |
| 78 | if (isDiminishing || tracker.continuationCount > 0) { |
| 79 | return { |
| 80 | action: 'stop', |
| 81 | completionEvent: { |
| 82 | continuationCount: tracker.continuationCount, |
| 83 | pct, |
| 84 | turnTokens, |
| 85 | budget, |
| 86 | diminishingReturns: isDiminishing, |
| 87 | durationMs: Date.now() - tracker.startedAt, |
| 88 | }, |
| 89 | } |
| 90 | } |
| 91 | |
| 92 | return { action: 'stop', completionEvent: null } |
| 93 | } |
no test coverage detected