Skip to content

Commit da1ba7c

Browse files
committed
Add error handling properties to language model tool results
1 parent d390495 commit da1ba7c

File tree

4 files changed

+37
-3
lines changed

4 files changed

+37
-3
lines changed

src/vs/workbench/api/browser/mainThreadLanguageModelTools.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,12 @@ export class MainThreadLanguageModelTools extends Disposable implements MainThre
5757
token ?? CancellationToken.None,
5858
);
5959

60-
// Only return content and metadata to EH
6160
const out: Dto<IToolResult> = {
6261
content: result.content,
63-
toolMetadata: result.toolMetadata
62+
toolResultMessage: result.toolResultMessage,
63+
toolResultError: result.toolResultError,
64+
toolMetadata: result.toolMetadata,
65+
hasError: result.hasError
6466
};
6567
return toolResultHasBuffers(result) ? new SerializableObjectWithBuffers(out) : out;
6668
}

src/vs/workbench/api/common/extHostTypeConverters.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3594,7 +3594,7 @@ export namespace LanguageModelToolSource {
35943594

35953595
export namespace LanguageModelToolResult {
35963596
export function to(result: IToolResult): vscode.LanguageModelToolResult {
3597-
return new types.LanguageModelToolResult(result.content.map(item => {
3597+
const toolResult = new types.LanguageModelToolResult(result.content.map(item => {
35983598
if (item.kind === 'text') {
35993599
return new types.LanguageModelTextPart(item.value, item.audience);
36003600
} else if (item.kind === 'data') {
@@ -3603,6 +3603,21 @@ export namespace LanguageModelToolResult {
36033603
return new types.LanguageModelPromptTsxPart(item.value);
36043604
}
36053605
}));
3606+
3607+
if (result.toolResultMessage) {
3608+
(toolResult as vscode.ExtendedLanguageModelToolResult).toolResultMessage = typeof result.toolResultMessage === 'string' ? result.toolResultMessage : MarkdownString.to(result.toolResultMessage);
3609+
}
3610+
if (result.toolMetadata) {
3611+
(toolResult as vscode.ExtendedLanguageModelToolResult).toolMetadata = result.toolMetadata;
3612+
}
3613+
if (result.toolResultError) {
3614+
(toolResult as vscode.ExtendedLanguageModelToolResult).toolResultError = result.toolResultError;
3615+
}
3616+
if (result.hasError !== undefined) {
3617+
(toolResult as vscode.ExtendedLanguageModelToolResult).hasError = result.hasError;
3618+
}
3619+
3620+
return toolResult;
36063621
}
36073622

36083623
export function from(result: vscode.ExtendedLanguageModelToolResult, extension: IExtensionDescription): Dto<IToolResult> | SerializableObjectWithBuffers<Dto<IToolResult>> {
@@ -3648,6 +3663,9 @@ export namespace LanguageModelToolResult {
36483663
}),
36493664
toolResultMessage: MarkdownString.fromStrict(result.toolResultMessage),
36503665
toolResultDetails: result.toolResultDetails?.map(detail => URI.isUri(detail) ? detail : Location.from(detail as vscode.Location)),
3666+
toolResultError: result.toolResultError,
3667+
toolMetadata: result.toolMetadata,
3668+
hasError: result.hasError,
36513669
};
36523670

36533671
return hasBuffers ? new SerializableObjectWithBuffers(dto) : dto;
@@ -3666,9 +3684,18 @@ export namespace LanguageModelToolResult2 {
36663684
}
36673685
}));
36683686

3687+
if (result.toolResultMessage) {
3688+
(toolResult as vscode.ExtendedLanguageModelToolResult).toolResultMessage = typeof result.toolResultMessage === 'string' ? result.toolResultMessage : MarkdownString.to(result.toolResultMessage);
3689+
}
36693690
if (result.toolMetadata) {
36703691
(toolResult as vscode.ExtendedLanguageModelToolResult).toolMetadata = result.toolMetadata;
36713692
}
3693+
if (result.toolResultError) {
3694+
(toolResult as vscode.ExtendedLanguageModelToolResult).toolResultError = result.toolResultError;
3695+
}
3696+
if (result.hasError !== undefined) {
3697+
(toolResult as vscode.ExtendedLanguageModelToolResult).hasError = result.hasError;
3698+
}
36723699

36733700
return toolResult;
36743701
}
@@ -3734,7 +3761,9 @@ export namespace LanguageModelToolResult2 {
37343761
}),
37353762
toolResultMessage: MarkdownString.fromStrict(result.toolResultMessage),
37363763
toolResultDetails: detailsDto,
3764+
toolResultError: result.toolResultError,
37373765
toolMetadata: result.toolMetadata,
3766+
hasError: result.hasError,
37383767
};
37393768

37403769
return hasBuffers ? new SerializableObjectWithBuffers(dto) : dto;

src/vs/workbench/contrib/chat/common/languageModelToolsService.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,8 @@ export interface IToolResult {
208208
toolMetadata?: unknown;
209209
/** Whether to ask the user to confirm these tool results. Overrides {@link IToolConfirmationMessages.confirmResults}. */
210210
confirmResults?: boolean;
211+
/** Whether there was an error calling the tool. The tool may still have partially succeeded. */
212+
hasError?: boolean;
211213
}
212214

213215
export function toolContentToA11yString(part: IToolResult['content']) {

src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ declare module 'vscode' {
257257
export class ExtendedLanguageModelToolResult extends LanguageModelToolResult {
258258
toolResultMessage?: string | MarkdownString;
259259
toolResultDetails?: Array<Uri | Location>;
260+
toolResultError?: string;
260261
toolMetadata?: unknown;
261262
/** Whether there was an error calling the tool. The tool may still have partially succeeded. */
262263
hasError?: boolean;

0 commit comments

Comments
 (0)