mirror of
https://github.com/QwenLM/qwen-code.git
synced 2025-12-19 09:33:53 +00:00
Show error instead of aborting if model fails to call tool (#7005)
This commit is contained in:
committed by
GitHub
parent
ade703944d
commit
7fa592f342
@@ -370,74 +370,75 @@ class Session {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
const invocation = tool.build(args);
|
try {
|
||||||
const confirmationDetails =
|
const invocation = tool.build(args);
|
||||||
await invocation.shouldConfirmExecute(abortSignal);
|
|
||||||
|
|
||||||
if (confirmationDetails) {
|
const confirmationDetails =
|
||||||
const content: acp.ToolCallContent[] = [];
|
await invocation.shouldConfirmExecute(abortSignal);
|
||||||
|
|
||||||
if (confirmationDetails.type === 'edit') {
|
if (confirmationDetails) {
|
||||||
content.push({
|
const content: acp.ToolCallContent[] = [];
|
||||||
type: 'diff',
|
|
||||||
path: confirmationDetails.fileName,
|
if (confirmationDetails.type === 'edit') {
|
||||||
oldText: confirmationDetails.originalContent,
|
content.push({
|
||||||
newText: confirmationDetails.newContent,
|
type: 'diff',
|
||||||
|
path: confirmationDetails.fileName,
|
||||||
|
oldText: confirmationDetails.originalContent,
|
||||||
|
newText: confirmationDetails.newContent,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const params: acp.RequestPermissionRequest = {
|
||||||
|
sessionId: this.id,
|
||||||
|
options: toPermissionOptions(confirmationDetails),
|
||||||
|
toolCall: {
|
||||||
|
toolCallId: callId,
|
||||||
|
status: 'pending',
|
||||||
|
title: invocation.getDescription(),
|
||||||
|
content,
|
||||||
|
locations: invocation.toolLocations(),
|
||||||
|
kind: tool.kind,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const output = await this.client.requestPermission(params);
|
||||||
|
const outcome =
|
||||||
|
output.outcome.outcome === 'cancelled'
|
||||||
|
? ToolConfirmationOutcome.Cancel
|
||||||
|
: z
|
||||||
|
.nativeEnum(ToolConfirmationOutcome)
|
||||||
|
.parse(output.outcome.optionId);
|
||||||
|
|
||||||
|
await confirmationDetails.onConfirm(outcome);
|
||||||
|
|
||||||
|
switch (outcome) {
|
||||||
|
case ToolConfirmationOutcome.Cancel:
|
||||||
|
return errorResponse(
|
||||||
|
new Error(`Tool "${fc.name}" was canceled by the user.`),
|
||||||
|
);
|
||||||
|
case ToolConfirmationOutcome.ProceedOnce:
|
||||||
|
case ToolConfirmationOutcome.ProceedAlways:
|
||||||
|
case ToolConfirmationOutcome.ProceedAlwaysServer:
|
||||||
|
case ToolConfirmationOutcome.ProceedAlwaysTool:
|
||||||
|
case ToolConfirmationOutcome.ModifyWithEditor:
|
||||||
|
break;
|
||||||
|
default: {
|
||||||
|
const resultOutcome: never = outcome;
|
||||||
|
throw new Error(`Unexpected: ${resultOutcome}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
await this.sendUpdate({
|
||||||
|
sessionUpdate: 'tool_call',
|
||||||
|
toolCallId: callId,
|
||||||
|
status: 'in_progress',
|
||||||
|
title: invocation.getDescription(),
|
||||||
|
content: [],
|
||||||
|
locations: invocation.toolLocations(),
|
||||||
|
kind: tool.kind,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
const params: acp.RequestPermissionRequest = {
|
|
||||||
sessionId: this.id,
|
|
||||||
options: toPermissionOptions(confirmationDetails),
|
|
||||||
toolCall: {
|
|
||||||
toolCallId: callId,
|
|
||||||
status: 'pending',
|
|
||||||
title: invocation.getDescription(),
|
|
||||||
content,
|
|
||||||
locations: invocation.toolLocations(),
|
|
||||||
kind: tool.kind,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const output = await this.client.requestPermission(params);
|
|
||||||
const outcome =
|
|
||||||
output.outcome.outcome === 'cancelled'
|
|
||||||
? ToolConfirmationOutcome.Cancel
|
|
||||||
: z
|
|
||||||
.nativeEnum(ToolConfirmationOutcome)
|
|
||||||
.parse(output.outcome.optionId);
|
|
||||||
|
|
||||||
await confirmationDetails.onConfirm(outcome);
|
|
||||||
|
|
||||||
switch (outcome) {
|
|
||||||
case ToolConfirmationOutcome.Cancel:
|
|
||||||
return errorResponse(
|
|
||||||
new Error(`Tool "${fc.name}" was canceled by the user.`),
|
|
||||||
);
|
|
||||||
case ToolConfirmationOutcome.ProceedOnce:
|
|
||||||
case ToolConfirmationOutcome.ProceedAlways:
|
|
||||||
case ToolConfirmationOutcome.ProceedAlwaysServer:
|
|
||||||
case ToolConfirmationOutcome.ProceedAlwaysTool:
|
|
||||||
case ToolConfirmationOutcome.ModifyWithEditor:
|
|
||||||
break;
|
|
||||||
default: {
|
|
||||||
const resultOutcome: never = outcome;
|
|
||||||
throw new Error(`Unexpected: ${resultOutcome}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
await this.sendUpdate({
|
|
||||||
sessionUpdate: 'tool_call',
|
|
||||||
toolCallId: callId,
|
|
||||||
status: 'in_progress',
|
|
||||||
title: invocation.getDescription(),
|
|
||||||
content: [],
|
|
||||||
locations: invocation.toolLocations(),
|
|
||||||
kind: tool.kind,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
const toolResult: ToolResult = await invocation.execute(abortSignal);
|
const toolResult: ToolResult = await invocation.execute(abortSignal);
|
||||||
const content = toToolCallContent(toolResult);
|
const content = toToolCallContent(toolResult);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user