mirror of
https://github.com/QwenLM/qwen-code.git
synced 2025-12-21 01:07:46 +00:00
Adding TurnId to Tool call and API responses and error logs. (#3039)
Co-authored-by: Scott Densmore <scottdensmore@mac.com>
This commit is contained in:
@@ -265,6 +265,10 @@ export class ClearcutLogger {
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_USER_PROMPT_LENGTH,
|
||||
value: JSON.stringify(event.prompt_length),
|
||||
},
|
||||
{
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
|
||||
value: JSON.stringify(event.prompt_id),
|
||||
},
|
||||
];
|
||||
|
||||
this.enqueueLogEvent(this.createLogEvent(new_prompt_event_name, data));
|
||||
@@ -279,6 +283,10 @@ export class ClearcutLogger {
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_TOOL_CALL_NAME,
|
||||
value: JSON.stringify(event.function_name),
|
||||
},
|
||||
{
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
|
||||
value: JSON.stringify(event.prompt_id),
|
||||
},
|
||||
{
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_TOOL_CALL_DECISION,
|
||||
value: JSON.stringify(event.decision),
|
||||
@@ -313,6 +321,10 @@ export class ClearcutLogger {
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_REQUEST_MODEL,
|
||||
value: JSON.stringify(event.model),
|
||||
},
|
||||
{
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
|
||||
value: JSON.stringify(event.prompt_id),
|
||||
},
|
||||
];
|
||||
|
||||
this.enqueueLogEvent(this.createLogEvent(api_request_event_name, data));
|
||||
@@ -327,6 +339,10 @@ export class ClearcutLogger {
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_RESPONSE_MODEL,
|
||||
value: JSON.stringify(event.model),
|
||||
},
|
||||
{
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
|
||||
value: JSON.stringify(event.prompt_id),
|
||||
},
|
||||
{
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_RESPONSE_STATUS_CODE,
|
||||
value: JSON.stringify(event.status_code),
|
||||
@@ -378,6 +394,10 @@ export class ClearcutLogger {
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_ERROR_MODEL,
|
||||
value: JSON.stringify(event.model),
|
||||
},
|
||||
{
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_PROMPT_ID,
|
||||
value: JSON.stringify(event.prompt_id),
|
||||
},
|
||||
{
|
||||
gemini_cli_key: EventMetadataKey.GEMINI_CLI_API_ERROR_TYPE,
|
||||
value: JSON.stringify(event.error_type),
|
||||
|
||||
@@ -137,6 +137,13 @@ export enum EventMetadataKey {
|
||||
|
||||
// Logs the end of a session.
|
||||
GEMINI_CLI_END_SESSION_ID = 34,
|
||||
|
||||
// ==========================================================================
|
||||
// Shared Keys
|
||||
// ===========================================================================
|
||||
|
||||
// Logs the Prompt Id
|
||||
GEMINI_CLI_PROMPT_ID = 35,
|
||||
}
|
||||
|
||||
export function getEventMetadataKey(
|
||||
|
||||
@@ -127,7 +127,7 @@ describe('loggers', () => {
|
||||
} as unknown as Config;
|
||||
|
||||
it('should log a user prompt', () => {
|
||||
const event = new UserPromptEvent(11, 'test-prompt');
|
||||
const event = new UserPromptEvent(11, 'prompt-id-8', 'test-prompt');
|
||||
|
||||
logUserPrompt(mockConfig, event);
|
||||
|
||||
@@ -201,6 +201,7 @@ describe('loggers', () => {
|
||||
const event = new ApiResponseEvent(
|
||||
'test-model',
|
||||
100,
|
||||
'prompt-id-1',
|
||||
usageData,
|
||||
'test-response',
|
||||
);
|
||||
@@ -224,6 +225,7 @@ describe('loggers', () => {
|
||||
tool_token_count: 2,
|
||||
total_token_count: 0,
|
||||
response_text: 'test-response',
|
||||
prompt_id: 'prompt-id-1',
|
||||
},
|
||||
});
|
||||
|
||||
@@ -260,6 +262,7 @@ describe('loggers', () => {
|
||||
const event = new ApiResponseEvent(
|
||||
'test-model',
|
||||
100,
|
||||
'prompt-id-1',
|
||||
usageData,
|
||||
'test-response',
|
||||
'test-error',
|
||||
@@ -296,7 +299,11 @@ describe('loggers', () => {
|
||||
} as Config;
|
||||
|
||||
it('should log an API request with request_text', () => {
|
||||
const event = new ApiRequestEvent('test-model', 'This is a test request');
|
||||
const event = new ApiRequestEvent(
|
||||
'test-model',
|
||||
'prompt-id-7',
|
||||
'This is a test request',
|
||||
);
|
||||
|
||||
logApiRequest(mockConfig, event);
|
||||
|
||||
@@ -308,12 +315,13 @@ describe('loggers', () => {
|
||||
'event.timestamp': '2025-01-01T00:00:00.000Z',
|
||||
model: 'test-model',
|
||||
request_text: 'This is a test request',
|
||||
prompt_id: 'prompt-id-7',
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('should log an API request without request_text', () => {
|
||||
const event = new ApiRequestEvent('test-model');
|
||||
const event = new ApiRequestEvent('test-model', 'prompt-id-6');
|
||||
|
||||
logApiRequest(mockConfig, event);
|
||||
|
||||
@@ -324,6 +332,7 @@ describe('loggers', () => {
|
||||
'event.name': EVENT_API_REQUEST,
|
||||
'event.timestamp': '2025-01-01T00:00:00.000Z',
|
||||
model: 'test-model',
|
||||
prompt_id: 'prompt-id-6',
|
||||
},
|
||||
});
|
||||
});
|
||||
@@ -394,6 +403,7 @@ describe('loggers', () => {
|
||||
},
|
||||
callId: 'test-call-id',
|
||||
isClientInitiated: true,
|
||||
prompt_id: 'prompt-id-1',
|
||||
},
|
||||
response: {
|
||||
callId: 'test-call-id',
|
||||
@@ -427,6 +437,7 @@ describe('loggers', () => {
|
||||
duration_ms: 100,
|
||||
success: true,
|
||||
decision: ToolCallDecision.ACCEPT,
|
||||
prompt_id: 'prompt-id-1',
|
||||
},
|
||||
});
|
||||
|
||||
@@ -455,6 +466,7 @@ describe('loggers', () => {
|
||||
},
|
||||
callId: 'test-call-id',
|
||||
isClientInitiated: true,
|
||||
prompt_id: 'prompt-id-2',
|
||||
},
|
||||
response: {
|
||||
callId: 'test-call-id',
|
||||
@@ -487,6 +499,7 @@ describe('loggers', () => {
|
||||
duration_ms: 100,
|
||||
success: false,
|
||||
decision: ToolCallDecision.REJECT,
|
||||
prompt_id: 'prompt-id-2',
|
||||
},
|
||||
});
|
||||
|
||||
@@ -516,6 +529,7 @@ describe('loggers', () => {
|
||||
},
|
||||
callId: 'test-call-id',
|
||||
isClientInitiated: true,
|
||||
prompt_id: 'prompt-id-3',
|
||||
},
|
||||
response: {
|
||||
callId: 'test-call-id',
|
||||
@@ -549,6 +563,7 @@ describe('loggers', () => {
|
||||
duration_ms: 100,
|
||||
success: true,
|
||||
decision: ToolCallDecision.MODIFY,
|
||||
prompt_id: 'prompt-id-3',
|
||||
},
|
||||
});
|
||||
|
||||
@@ -578,6 +593,7 @@ describe('loggers', () => {
|
||||
},
|
||||
callId: 'test-call-id',
|
||||
isClientInitiated: true,
|
||||
prompt_id: 'prompt-id-4',
|
||||
},
|
||||
response: {
|
||||
callId: 'test-call-id',
|
||||
@@ -609,6 +625,7 @@ describe('loggers', () => {
|
||||
),
|
||||
duration_ms: 100,
|
||||
success: true,
|
||||
prompt_id: 'prompt-id-4',
|
||||
},
|
||||
});
|
||||
|
||||
@@ -638,6 +655,7 @@ describe('loggers', () => {
|
||||
},
|
||||
callId: 'test-call-id',
|
||||
isClientInitiated: true,
|
||||
prompt_id: 'prompt-id-5',
|
||||
},
|
||||
response: {
|
||||
callId: 'test-call-id',
|
||||
@@ -675,6 +693,7 @@ describe('loggers', () => {
|
||||
'error.message': 'test-error',
|
||||
error_type: 'test-error-type',
|
||||
'error.type': 'test-error-type',
|
||||
prompt_id: 'prompt-id-5',
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -95,12 +95,14 @@ export class UserPromptEvent {
|
||||
'event.name': 'user_prompt';
|
||||
'event.timestamp': string; // ISO 8601
|
||||
prompt_length: number;
|
||||
prompt_id: string;
|
||||
prompt?: string;
|
||||
|
||||
constructor(prompt_length: number, prompt?: string) {
|
||||
constructor(prompt_length: number, prompt_Id: string, prompt?: string) {
|
||||
this['event.name'] = 'user_prompt';
|
||||
this['event.timestamp'] = new Date().toISOString();
|
||||
this.prompt_length = prompt_length;
|
||||
this.prompt_id = prompt_Id;
|
||||
this.prompt = prompt;
|
||||
}
|
||||
}
|
||||
@@ -115,6 +117,7 @@ export class ToolCallEvent {
|
||||
decision?: ToolCallDecision;
|
||||
error?: string;
|
||||
error_type?: string;
|
||||
prompt_id: string;
|
||||
|
||||
constructor(call: CompletedToolCall) {
|
||||
this['event.name'] = 'tool_call';
|
||||
@@ -128,6 +131,7 @@ export class ToolCallEvent {
|
||||
: undefined;
|
||||
this.error = call.response.error?.message;
|
||||
this.error_type = call.response.error?.name;
|
||||
this.prompt_id = call.request.prompt_id;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,12 +139,14 @@ export class ApiRequestEvent {
|
||||
'event.name': 'api_request';
|
||||
'event.timestamp': string; // ISO 8601
|
||||
model: string;
|
||||
prompt_id: string;
|
||||
request_text?: string;
|
||||
|
||||
constructor(model: string, request_text?: string) {
|
||||
constructor(model: string, prompt_id: string, request_text?: string) {
|
||||
this['event.name'] = 'api_request';
|
||||
this['event.timestamp'] = new Date().toISOString();
|
||||
this.model = model;
|
||||
this.prompt_id = prompt_id;
|
||||
this.request_text = request_text;
|
||||
}
|
||||
}
|
||||
@@ -153,11 +159,13 @@ export class ApiErrorEvent {
|
||||
error_type?: string;
|
||||
status_code?: number | string;
|
||||
duration_ms: number;
|
||||
prompt_id: string;
|
||||
|
||||
constructor(
|
||||
model: string,
|
||||
error: string,
|
||||
duration_ms: number,
|
||||
prompt_id: string,
|
||||
error_type?: string,
|
||||
status_code?: number | string,
|
||||
) {
|
||||
@@ -168,6 +176,7 @@ export class ApiErrorEvent {
|
||||
this.error_type = error_type;
|
||||
this.status_code = status_code;
|
||||
this.duration_ms = duration_ms;
|
||||
this.prompt_id = prompt_id;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -185,10 +194,12 @@ export class ApiResponseEvent {
|
||||
tool_token_count: number;
|
||||
total_token_count: number;
|
||||
response_text?: string;
|
||||
prompt_id: string;
|
||||
|
||||
constructor(
|
||||
model: string,
|
||||
duration_ms: number,
|
||||
prompt_id: string,
|
||||
usage_data?: GenerateContentResponseUsageMetadata,
|
||||
response_text?: string,
|
||||
error?: string,
|
||||
@@ -206,6 +217,7 @@ export class ApiResponseEvent {
|
||||
this.total_token_count = usage_data?.totalTokenCount ?? 0;
|
||||
this.response_text = response_text;
|
||||
this.error = error;
|
||||
this.prompt_id = prompt_id;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ const createFakeCompletedToolCall = (
|
||||
name,
|
||||
args: { foo: 'bar' },
|
||||
isClientInitiated: false,
|
||||
prompt_id: 'prompt-id-1',
|
||||
};
|
||||
|
||||
if (success) {
|
||||
|
||||
Reference in New Issue
Block a user