Skip to content

Commit a7ca107

Browse files
committed
[Condense] Track telemetry for condense and truncate operations
1 parent fc9a42d commit a7ca107

File tree

5 files changed

+24
-4
lines changed

5 files changed

+24
-4
lines changed

src/core/condense/index.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import Anthropic from "@anthropic-ai/sdk"
22
import { ApiHandler } from "../../api"
33
import { ApiMessage } from "../task-persistence/apiMessages"
44
import { maybeRemoveImageBlocks } from "../../api/transform/image-cleaning"
5+
import { telemetryService } from "../../services/telemetry/TelemetryService"
56

67
export const N_MESSAGES_TO_KEEP = 3
78

@@ -58,13 +59,16 @@ export type SummarizeResponse = {
5859
* @param {ApiMessage[]} messages - The conversation messages
5960
* @param {ApiHandler} apiHandler - The API handler to use for token counting.
6061
* @param {string} systemPrompt - The system prompt for API requests, which should be considered in the context token count
62+
* @param {string} taskId - The task ID for the conversation, used for telemetry
6163
* @returns {SummarizeResponse} - The result of the summarization operation (see above)
6264
*/
6365
export async function summarizeConversation(
6466
messages: ApiMessage[],
6567
apiHandler: ApiHandler,
6668
systemPrompt: string,
69+
taskId: string,
6770
): Promise<SummarizeResponse> {
71+
telemetryService.captureContextCondensed(taskId)
6872
const response: SummarizeResponse = { messages, cost: 0, summary: "" }
6973
const messagesToSummarize = getMessagesSinceLastSummary(messages.slice(0, -N_MESSAGES_TO_KEEP))
7074
if (messagesToSummarize.length <= 1) {

src/core/sliding-window/index.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { Anthropic } from "@anthropic-ai/sdk"
22
import { ApiHandler } from "../../api"
33
import { summarizeConversation, SummarizeResponse } from "../condense"
44
import { ApiMessage } from "../task-persistence/apiMessages"
5+
import { telemetryService } from "../../services/telemetry/TelemetryService"
56

67
/**
78
* Default percentage of the context window to use as a buffer when deciding when to truncate
@@ -31,9 +32,11 @@ export async function estimateTokenCount(
3132
*
3233
* @param {ApiMessage[]} messages - The conversation messages.
3334
* @param {number} fracToRemove - The fraction (between 0 and 1) of messages (excluding the first) to remove.
35+
* @param {string} taskId - The task ID for the conversation, used for telemetry
3436
* @returns {ApiMessage[]} The truncated conversation messages.
3537
*/
36-
export function truncateConversation(messages: ApiMessage[], fracToRemove: number): ApiMessage[] {
38+
export function truncateConversation(messages: ApiMessage[], fracToRemove: number, taskId: string): ApiMessage[] {
39+
telemetryService.captureSlidingWindowTruncation(taskId)
3740
const truncatedMessages = [messages[0]]
3841
const rawMessagesToRemove = Math.floor((messages.length - 1) * fracToRemove)
3942
const messagesToRemove = rawMessagesToRemove - (rawMessagesToRemove % 2)
@@ -66,6 +69,7 @@ type TruncateOptions = {
6669
autoCondenseContext: boolean
6770
autoCondenseContextPercent: number
6871
systemPrompt: string
72+
taskId: string
6973
}
7074

7175
type TruncateResponse = SummarizeResponse & { prevContextTokens: number }
@@ -86,6 +90,7 @@ export async function truncateConversationIfNeeded({
8690
autoCondenseContext,
8791
autoCondenseContextPercent,
8892
systemPrompt,
93+
taskId,
8994
}: TruncateOptions): Promise<TruncateResponse> {
9095
// Calculate the maximum tokens reserved for response
9196
const reservedTokens = maxTokens || contextWindow * 0.2
@@ -108,7 +113,7 @@ export async function truncateConversationIfNeeded({
108113
const contextPercent = (100 * prevContextTokens) / contextWindow
109114
if (contextPercent >= autoCondenseContextPercent || prevContextTokens > allowedTokens) {
110115
// Attempt to intelligently condense the context
111-
const result = await summarizeConversation(messages, apiHandler, systemPrompt)
116+
const result = await summarizeConversation(messages, apiHandler, systemPrompt, taskId)
112117
if (result.summary) {
113118
return { ...result, prevContextTokens }
114119
}
@@ -117,7 +122,7 @@ export async function truncateConversationIfNeeded({
117122

118123
// Fall back to sliding window truncation if needed
119124
if (prevContextTokens > allowedTokens) {
120-
const truncatedMessages = truncateConversation(messages, 0.5)
125+
const truncatedMessages = truncateConversation(messages, 0.5, taskId)
121126
return { messages: truncatedMessages, prevContextTokens, summary: "", cost: 0 }
122127
}
123128
// No truncation or condensation needed

src/core/task/Task.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ export class Task extends EventEmitter<ClineEvents> {
488488
summary,
489489
cost,
490490
newContextTokens = 0,
491-
} = await summarizeConversation(this.apiConversationHistory, this.api, systemPrompt)
491+
} = await summarizeConversation(this.apiConversationHistory, this.api, systemPrompt, this.taskId)
492492
if (!summary) {
493493
return
494494
}
@@ -1518,6 +1518,7 @@ export class Task extends EventEmitter<ClineEvents> {
15181518
autoCondenseContext,
15191519
autoCondenseContextPercent,
15201520
systemPrompt,
1521+
taskId: this.taskId,
15211522
})
15221523
if (truncateResult.messages !== this.apiConversationHistory) {
15231524
await this.overwriteApiConversationHistory(truncateResult.messages)

src/services/telemetry/PostHogClient.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ export class PostHogClient {
2828
CHECKPOINT_DIFFED: "Checkpoint Diffed",
2929
CODE_ACTION_USED: "Code Action Used",
3030
PROMPT_ENHANCED: "Prompt Enhanced",
31+
CONTEXT_CONDENSED: "Context Condensed",
32+
SLIDING_WINDOW_TRUNCATION: "Sliding Window Truncation",
3133
},
3234
ERRORS: {
3335
SCHEMA_VALIDATION_ERROR: "Schema Validation Error",

src/services/telemetry/TelemetryService.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,14 @@ class TelemetryService {
120120
this.captureEvent(PostHogClient.EVENTS.TASK.CHECKPOINT_RESTORED, { taskId })
121121
}
122122

123+
public captureContextCondensed(taskId: string): void {
124+
this.captureEvent(PostHogClient.EVENTS.TASK.CONTEXT_CONDENSED, { taskId })
125+
}
126+
127+
public captureSlidingWindowTruncation(taskId: string): void {
128+
this.captureEvent(PostHogClient.EVENTS.TASK.SLIDING_WINDOW_TRUNCATION, { taskId })
129+
}
130+
123131
public captureCodeActionUsed(actionType: string): void {
124132
this.captureEvent(PostHogClient.EVENTS.TASK.CODE_ACTION_USED, { actionType })
125133
}

0 commit comments

Comments
 (0)