diff options
| author | Sandy Tao <[email protected]> | 2025-07-14 21:44:07 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2025-07-15 04:44:07 +0000 |
| commit | 886faa2990b191a0dbd01dc58a88e09e342886b5 (patch) | |
| tree | b22e1c3b95efe0678b86bfa1d959f17c9032b28e /packages/core/src/services/loopDetectionService.ts | |
| parent | 734da8b9d24ab7e2cfcfe80e43f061734b7ae6ba (diff) | |
Log the 2 types of loop detection (#4193)
Diffstat (limited to 'packages/core/src/services/loopDetectionService.ts')
| -rw-r--r-- | packages/core/src/services/loopDetectionService.ts | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/packages/core/src/services/loopDetectionService.ts b/packages/core/src/services/loopDetectionService.ts index 57e0980c..c1078f69 100644 --- a/packages/core/src/services/loopDetectionService.ts +++ b/packages/core/src/services/loopDetectionService.ts @@ -6,6 +6,9 @@ import { createHash } from 'crypto'; import { GeminiEventType, ServerGeminiStreamEvent } from '../core/turn.js'; +import { logLoopDetected } from '../telemetry/loggers.js'; +import { LoopDetectedEvent, LoopType } from '../telemetry/types.js'; +import { Config } from '../config/config.js'; const TOOL_CALL_LOOP_THRESHOLD = 5; const CONTENT_LOOP_THRESHOLD = 10; @@ -24,6 +27,11 @@ export class LoopDetectionService { private lastRepeatedSentence: string = ''; private sentenceRepetitionCount: number = 0; private partialContent: string = ''; + private config: Config; + + constructor(config: Config) { + this.config = config; + } private getToolCallKey(toolCall: { name: string; args: object }): string { const argsString = JSON.stringify(toolCall.args); @@ -59,7 +67,14 @@ export class LoopDetectionService { this.lastToolCallKey = key; this.toolCallRepetitionCount = 1; } - return this.toolCallRepetitionCount >= TOOL_CALL_LOOP_THRESHOLD; + if (this.toolCallRepetitionCount >= TOOL_CALL_LOOP_THRESHOLD) { + logLoopDetected( + this.config, + new LoopDetectedEvent(LoopType.CONSECUTIVE_IDENTICAL_TOOL_CALLS), + ); + return true; + } + return false; } private checkContentLoop(content: string): boolean { @@ -94,6 +109,10 @@ export class LoopDetectionService { } if (this.sentenceRepetitionCount >= CONTENT_LOOP_THRESHOLD) { + logLoopDetected( + this.config, + new LoopDetectedEvent(LoopType.CHANTING_IDENTICAL_SENTENCES), + ); return true; } } |
