feat(core): enhance loop detection with 2-stage check (#12902)

This commit is contained in:
Sandy Tao
2025-11-11 20:49:00 -08:00
committed by GitHub
parent cab9b1f370
commit 408b885689
10 changed files with 438 additions and 60 deletions
@@ -37,6 +37,7 @@ import type {
RecoveryAttemptEvent,
WebFetchFallbackAttemptEvent,
ExtensionUpdateEvent,
LlmLoopCheckEvent,
} from '../types.js';
import { EventMetadataKey } from './event-metadata-key.js';
import type { Config } from '../../config/config.js';
@@ -92,6 +93,7 @@ export enum EventNames {
AGENT_FINISH = 'agent_finish',
RECOVERY_ATTEMPT = 'recovery_attempt',
WEB_FETCH_FALLBACK_ATTEMPT = 'web_fetch_fallback_attempt',
LLM_LOOP_CHECK = 'llm_loop_check',
}
export interface LogResponse {
@@ -735,6 +737,14 @@ export class ClearcutLogger {
},
];
if (event.confirmed_by_model) {
data.push({
gemini_cli_key:
EventMetadataKey.GEMINI_CLI_LOOP_DETECTED_CONFIRMED_BY_MODEL,
value: event.confirmed_by_model,
});
}
this.enqueueLogEvent(this.createLogEvent(EventNames.LOOP_DETECTED, data));
this.flushIfNeeded();
}
@@ -1269,6 +1279,32 @@ export class ClearcutLogger {
this.flushIfNeeded();
}
logLlmLoopCheckEvent(event: LlmLoopCheckEvent): void {
const data: EventValue[] = [
{
gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
value: event.prompt_id,
},
{
gemini_cli_key:
EventMetadataKey.GEMINI_CLI_LLM_LOOP_CHECK_FLASH_CONFIDENCE,
value: event.flash_confidence.toString(),
},
{
gemini_cli_key: EventMetadataKey.GEMINI_CLI_LLM_LOOP_CHECK_MAIN_MODEL,
value: event.main_model,
},
{
gemini_cli_key:
EventMetadataKey.GEMINI_CLI_LLM_LOOP_CHECK_MAIN_MODEL_CONFIDENCE,
value: event.main_model_confidence.toString(),
},
];
this.enqueueLogEvent(this.createLogEvent(EventNames.LLM_LOOP_CHECK, data));
this.flushIfNeeded();
}
/**
* Adds default fields to data, and returns a new data array. This fields
* should exist on all log events.
@@ -7,7 +7,7 @@
// Defines valid event metadata keys for Clearcut logging.
export enum EventMetadataKey {
// Deleted enums: 24
// Next ID: 122
// Next ID: 129
GEMINI_CLI_KEY_UNKNOWN = 0,
@@ -476,4 +476,20 @@ export enum EventMetadataKey {
// Logs whether the session is interactive.
GEMINI_CLI_INTERACTIVE = 125,
// ==========================================================================
// LLM Loop Check Event Keys
// ==========================================================================
// Logs the confidence score from the flash model loop check.
GEMINI_CLI_LLM_LOOP_CHECK_FLASH_CONFIDENCE = 126,
// Logs the name of the main model used for the secondary loop check.
GEMINI_CLI_LLM_LOOP_CHECK_MAIN_MODEL = 127,
// Logs the confidence score from the main model loop check.
GEMINI_CLI_LLM_LOOP_CHECK_MAIN_MODEL_CONFIDENCE = 128,
// Logs the model that confirmed the loop.
GEMINI_CLI_LOOP_DETECTED_CONFIRMED_BY_MODEL = 129,
}