From cfe8020e4eea77801264c93447539b32f8e8d3b3 Mon Sep 17 00:00:00 2001 From: Rob Lourens Date: Wed, 26 Feb 2025 18:48:19 -0800 Subject: [PATCH] Add ChatErrorLevel to ChatErrorDetails (#242139) We need this so that the error when the rate limit is exceeded can show as 'info' without having to set `responseIsFiltered` --- .../extensions/common/extensionsApiProposals.ts | 2 +- src/vs/workbench/api/common/extHost.api.impl.ts | 1 + src/vs/workbench/api/common/extHostTypes.ts | 6 ++++++ .../browser/chatContentParts/chatWarningContentPart.ts | 9 +++++---- .../workbench/contrib/chat/browser/chatListRenderer.ts | 7 ++++--- src/vs/workbench/contrib/chat/common/chatService.ts | 7 +++++++ .../vscode.proposed.chatParticipantPrivate.d.ts | 10 +++++++++- 7 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/vs/platform/extensions/common/extensionsApiProposals.ts b/src/vs/platform/extensions/common/extensionsApiProposals.ts index 6d62272e988..d006ee0201a 100644 --- a/src/vs/platform/extensions/common/extensionsApiProposals.ts +++ b/src/vs/platform/extensions/common/extensionsApiProposals.ts @@ -33,7 +33,7 @@ const _allApiProposals = { }, chatParticipantPrivate: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts', - version: 4 + version: 5 }, chatProvider: { proposal: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.chatProvider.d.ts', diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 78e34e821fa..898d747ddfb 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -1806,6 +1806,7 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I TextSearchContext2: TextSearchContext2, TextSearchMatch2: TextSearchMatch2, TextSearchCompleteMessageTypeNew: TextSearchCompleteMessageType, + ChatErrorLevel: extHostTypes.ChatErrorLevel, }; }; } diff --git a/src/vs/workbench/api/common/extHostTypes.ts b/src/vs/workbench/api/common/extHostTypes.ts index d9c68f67407..f1fcdc1ab1b 100644 --- a/src/vs/workbench/api/common/extHostTypes.ts +++ b/src/vs/workbench/api/common/extHostTypes.ts @@ -4750,6 +4750,12 @@ export class PreparedTerminalToolInvocation { ) { } } +export enum ChatErrorLevel { + Info = 0, + Warning = 1, + Error = 2 +} + export class LanguageModelChatMessage implements vscode.LanguageModelChatMessage { static User(content: string | (LanguageModelTextPart | LanguageModelToolResultPart | LanguageModelToolCallPart)[], name?: string): LanguageModelChatMessage { diff --git a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatWarningContentPart.ts b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatWarningContentPart.ts index 73ad31e50cf..236d3552e50 100644 --- a/src/vs/workbench/contrib/chat/browser/chatContentParts/chatWarningContentPart.ts +++ b/src/vs/workbench/contrib/chat/browser/chatContentParts/chatWarningContentPart.ts @@ -11,6 +11,7 @@ import { Disposable } from '../../../../../base/common/lifecycle.js'; import { MarkdownRenderer } from '../../../../../editor/browser/widget/markdownRenderer/browser/markdownRenderer.js'; import { IChatContentPart } from './chatContentParts.js'; import { IChatProgressRenderableResponseContent } from '../../common/chatModel.js'; +import { ChatErrorLevel } from '../../common/chatService.js'; const $ = dom.$; @@ -18,7 +19,7 @@ export class ChatWarningContentPart extends Disposable implements IChatContentPa public readonly domNode: HTMLElement; constructor( - kind: 'info' | 'warning' | 'error', + kind: ChatErrorLevel, content: IMarkdownString, renderer: MarkdownRenderer, ) { @@ -28,15 +29,15 @@ export class ChatWarningContentPart extends Disposable implements IChatContentPa let icon; let iconClass; switch (kind) { - case 'warning': + case ChatErrorLevel.Warning: icon = Codicon.warning; iconClass = '.chat-warning-codicon'; break; - case 'error': + case ChatErrorLevel.Error: icon = Codicon.error; iconClass = '.chat-error-codicon'; break; - case 'info': + case ChatErrorLevel.Info: icon = Codicon.info; iconClass = '.chat-info-codicon'; break; diff --git a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts index 81ec6916c42..95674d712b6 100644 --- a/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts +++ b/src/vs/workbench/contrib/chat/browser/chatListRenderer.ts @@ -47,7 +47,7 @@ import { ChatAgentLocation, IChatAgentMetadata } from '../common/chatAgents.js'; import { ChatContextKeys } from '../common/chatContextKeys.js'; import { IChatRequestVariableEntry, IChatTextEditGroup } from '../common/chatModel.js'; import { chatSubcommandLeader } from '../common/chatParserTypes.js'; -import { ChatAgentVoteDirection, ChatAgentVoteDownReason, IChatConfirmation, IChatContentReference, IChatFollowup, IChatMarkdownContent, IChatTask, IChatToolInvocation, IChatToolInvocationSerialized, IChatTreeData, IChatUndoStop } from '../common/chatService.js'; +import { ChatAgentVoteDirection, ChatAgentVoteDownReason, ChatErrorLevel, IChatConfirmation, IChatContentReference, IChatFollowup, IChatMarkdownContent, IChatTask, IChatToolInvocation, IChatToolInvocationSerialized, IChatTreeData, IChatUndoStop } from '../common/chatService.js'; import { IChatCodeCitations, IChatReferences, IChatRendererContent, IChatRequestViewModel, IChatResponseViewModel, IChatWorkingProgress, isRequestVM, isResponseVM } from '../common/chatViewModel.js'; import { getNWords } from '../common/chatWordCounter.js'; import { CodeBlockModelCollection } from '../common/codeBlockModelCollection.js'; @@ -613,7 +613,8 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer this.updateItemHeight(templateData))); } else { - const renderedError = this.instantiationService.createInstance(ChatWarningContentPart, element.errorDetails.responseIsFiltered ? 'info' : 'error', new MarkdownString(element.errorDetails.message), this.renderer); + const level = element.errorDetails.level ?? (element.errorDetails.responseIsFiltered ? ChatErrorLevel.Info : ChatErrorLevel.Error); + const renderedError = this.instantiationService.createInstance(ChatWarningContentPart, level, new MarkdownString(element.errorDetails.message), this.renderer); templateData.elementDisposables.add(renderedError); templateData.value.appendChild(renderedError.domNode); } @@ -882,7 +883,7 @@ export class ChatListItemRenderer extends Disposable implements ITreeRenderer; } +export enum ChatErrorLevel { + Info = 0, + Warning = 1, + Error = 2 +} + export interface IChatResponseErrorDetails { message: string; responseIsIncomplete?: boolean; responseIsFiltered?: boolean; responseIsRedacted?: boolean; isQuotaExceeded?: boolean; + level?: ChatErrorLevel; } export interface IChatResponseProgressFileTreeData { diff --git a/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts b/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts index 446f1f5f2b9..0f274bf257b 100644 --- a/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts +++ b/src/vscode-dts/vscode.proposed.chatParticipantPrivate.d.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -// version: 4 +// version: 5 declare module 'vscode' { @@ -83,6 +83,12 @@ declare module 'vscode' { supportIssueReporting?: boolean; } + export enum ChatErrorLevel { + Info = 0, + Warning = 1, + Error = 2, + } + export interface ChatErrorDetails { /** * If set to true, the message content is completely hidden. Only ChatErrorDetails#message will be shown. @@ -90,6 +96,8 @@ declare module 'vscode' { responseIsRedacted?: boolean; isQuotaExceeded?: boolean; + + level?: ChatErrorLevel; } export namespace chat {