mirror of
https://github.com/QwenLM/qwen-code.git
synced 2025-12-19 09:33:53 +00:00
Fix to send user tool confirmation decision for yolo or non interacti… (#5677)
Co-authored-by: Ravikant Agarwal <ravikantag@google.com>
This commit is contained in:
@@ -468,6 +468,10 @@ export class CoreToolScheduler {
|
||||
const { request: reqInfo, tool: toolInstance } = toolCall;
|
||||
try {
|
||||
if (this.config.getApprovalMode() === ApprovalMode.YOLO) {
|
||||
this.setToolCallOutcome(
|
||||
reqInfo.callId,
|
||||
ToolConfirmationOutcome.ProceedAlways,
|
||||
);
|
||||
this.setStatusInternal(reqInfo.callId, 'scheduled');
|
||||
} else {
|
||||
const confirmationDetails = await toolInstance.shouldConfirmExecute(
|
||||
@@ -521,6 +525,10 @@ export class CoreToolScheduler {
|
||||
wrappedConfirmationDetails,
|
||||
);
|
||||
} else {
|
||||
this.setToolCallOutcome(
|
||||
reqInfo.callId,
|
||||
ToolConfirmationOutcome.ProceedAlways,
|
||||
);
|
||||
this.setStatusInternal(reqInfo.callId, 'scheduled');
|
||||
}
|
||||
}
|
||||
@@ -555,13 +563,7 @@ export class CoreToolScheduler {
|
||||
await originalOnConfirm(outcome);
|
||||
}
|
||||
|
||||
this.toolCalls = this.toolCalls.map((call) => {
|
||||
if (call.request.callId !== callId) return call;
|
||||
return {
|
||||
...call,
|
||||
outcome,
|
||||
};
|
||||
});
|
||||
this.setToolCallOutcome(callId, outcome);
|
||||
|
||||
if (outcome === ToolConfirmationOutcome.Cancel || signal.aborted) {
|
||||
this.setStatusInternal(
|
||||
@@ -774,4 +776,14 @@ export class CoreToolScheduler {
|
||||
this.onToolCallsUpdate([...this.toolCalls]);
|
||||
}
|
||||
}
|
||||
|
||||
private setToolCallOutcome(callId: string, outcome: ToolConfirmationOutcome) {
|
||||
this.toolCalls = this.toolCalls.map((call) => {
|
||||
if (call.request.callId !== callId) return call;
|
||||
return {
|
||||
...call,
|
||||
outcome,
|
||||
};
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,6 +14,7 @@ import {
|
||||
} from '../index.js';
|
||||
import { Config } from '../config/config.js';
|
||||
import { convertToFunctionResponse } from './coreToolScheduler.js';
|
||||
import { ToolCallDecision } from '../telemetry/types.js';
|
||||
|
||||
/**
|
||||
* Executes a single tool call non-interactively.
|
||||
@@ -87,6 +88,7 @@ export async function executeToolCall(
|
||||
error_type:
|
||||
toolResult.error === undefined ? undefined : toolResult.error.type,
|
||||
prompt_id: toolCallRequest.prompt_id,
|
||||
decision: ToolCallDecision.AUTO_ACCEPT,
|
||||
});
|
||||
|
||||
const response = convertToFunctionResponse(
|
||||
|
||||
@@ -100,7 +100,7 @@ export function recordToolCallMetrics(
|
||||
functionName: string,
|
||||
durationMs: number,
|
||||
success: boolean,
|
||||
decision?: 'accept' | 'reject' | 'modify',
|
||||
decision?: 'accept' | 'reject' | 'modify' | 'auto_accept',
|
||||
): void {
|
||||
if (!toolCallCounter || !toolCallLatencyHistogram || !isMetricsInitialized)
|
||||
return;
|
||||
|
||||
@@ -14,6 +14,7 @@ export enum ToolCallDecision {
|
||||
ACCEPT = 'accept',
|
||||
REJECT = 'reject',
|
||||
MODIFY = 'modify',
|
||||
AUTO_ACCEPT = 'auto_accept',
|
||||
}
|
||||
|
||||
export function getDecisionFromOutcome(
|
||||
@@ -21,10 +22,11 @@ export function getDecisionFromOutcome(
|
||||
): ToolCallDecision {
|
||||
switch (outcome) {
|
||||
case ToolConfirmationOutcome.ProceedOnce:
|
||||
return ToolCallDecision.ACCEPT;
|
||||
case ToolConfirmationOutcome.ProceedAlways:
|
||||
case ToolConfirmationOutcome.ProceedAlwaysServer:
|
||||
case ToolConfirmationOutcome.ProceedAlwaysTool:
|
||||
return ToolCallDecision.ACCEPT;
|
||||
return ToolCallDecision.AUTO_ACCEPT;
|
||||
case ToolConfirmationOutcome.ModifyWithEditor:
|
||||
return ToolCallDecision.MODIFY;
|
||||
case ToolConfirmationOutcome.Cancel:
|
||||
|
||||
@@ -104,6 +104,7 @@ describe('UiTelemetryService', () => {
|
||||
[ToolCallDecision.ACCEPT]: 0,
|
||||
[ToolCallDecision.REJECT]: 0,
|
||||
[ToolCallDecision.MODIFY]: 0,
|
||||
[ToolCallDecision.AUTO_ACCEPT]: 0,
|
||||
},
|
||||
byName: {},
|
||||
},
|
||||
@@ -362,6 +363,7 @@ describe('UiTelemetryService', () => {
|
||||
[ToolCallDecision.ACCEPT]: 1,
|
||||
[ToolCallDecision.REJECT]: 0,
|
||||
[ToolCallDecision.MODIFY]: 0,
|
||||
[ToolCallDecision.AUTO_ACCEPT]: 0,
|
||||
},
|
||||
});
|
||||
});
|
||||
@@ -395,6 +397,7 @@ describe('UiTelemetryService', () => {
|
||||
[ToolCallDecision.ACCEPT]: 0,
|
||||
[ToolCallDecision.REJECT]: 1,
|
||||
[ToolCallDecision.MODIFY]: 0,
|
||||
[ToolCallDecision.AUTO_ACCEPT]: 0,
|
||||
},
|
||||
});
|
||||
});
|
||||
@@ -434,11 +437,13 @@ describe('UiTelemetryService', () => {
|
||||
[ToolCallDecision.ACCEPT]: 0,
|
||||
[ToolCallDecision.REJECT]: 0,
|
||||
[ToolCallDecision.MODIFY]: 0,
|
||||
[ToolCallDecision.AUTO_ACCEPT]: 0,
|
||||
});
|
||||
expect(tools.byName['test_tool'].decisions).toEqual({
|
||||
[ToolCallDecision.ACCEPT]: 0,
|
||||
[ToolCallDecision.REJECT]: 0,
|
||||
[ToolCallDecision.MODIFY]: 0,
|
||||
[ToolCallDecision.AUTO_ACCEPT]: 0,
|
||||
});
|
||||
});
|
||||
|
||||
@@ -483,6 +488,7 @@ describe('UiTelemetryService', () => {
|
||||
[ToolCallDecision.ACCEPT]: 1,
|
||||
[ToolCallDecision.REJECT]: 1,
|
||||
[ToolCallDecision.MODIFY]: 0,
|
||||
[ToolCallDecision.AUTO_ACCEPT]: 0,
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
@@ -32,6 +32,7 @@ export interface ToolCallStats {
|
||||
[ToolCallDecision.ACCEPT]: number;
|
||||
[ToolCallDecision.REJECT]: number;
|
||||
[ToolCallDecision.MODIFY]: number;
|
||||
[ToolCallDecision.AUTO_ACCEPT]: number;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -62,6 +63,7 @@ export interface SessionMetrics {
|
||||
[ToolCallDecision.ACCEPT]: number;
|
||||
[ToolCallDecision.REJECT]: number;
|
||||
[ToolCallDecision.MODIFY]: number;
|
||||
[ToolCallDecision.AUTO_ACCEPT]: number;
|
||||
};
|
||||
byName: Record<string, ToolCallStats>;
|
||||
};
|
||||
@@ -94,6 +96,7 @@ const createInitialMetrics = (): SessionMetrics => ({
|
||||
[ToolCallDecision.ACCEPT]: 0,
|
||||
[ToolCallDecision.REJECT]: 0,
|
||||
[ToolCallDecision.MODIFY]: 0,
|
||||
[ToolCallDecision.AUTO_ACCEPT]: 0,
|
||||
},
|
||||
byName: {},
|
||||
},
|
||||
@@ -192,6 +195,7 @@ export class UiTelemetryService extends EventEmitter {
|
||||
[ToolCallDecision.ACCEPT]: 0,
|
||||
[ToolCallDecision.REJECT]: 0,
|
||||
[ToolCallDecision.MODIFY]: 0,
|
||||
[ToolCallDecision.AUTO_ACCEPT]: 0,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user