Fix persisting chat agents for responses

This commit is contained in:
Rob Lourens
2023-10-21 18:05:07 -07:00
parent fd8a43c65c
commit e00496ed4e
3 changed files with 16 additions and 22 deletions
@@ -16,9 +16,12 @@ import { IChatRequestVariableValue } from 'vs/workbench/contrib/chat/common/chat
//#region agent service, commands etc
export interface IChatAgent {
export interface IChatAgentData {
id: string;
metadata: IChatAgentMetadata;
}
export interface IChatAgent extends IChatAgentData {
invoke(request: IChatAgentRequest, progress: (part: IChatProgress) => void, history: IChatMessage[], token: CancellationToken): Promise<IChatAgentResult>;
provideFollowups?(sessionId: string, token: CancellationToken): Promise<IChatFollowup[]>;
provideSlashCommands(token: CancellationToken): Promise<IChatAgentCommand[]>;
@@ -8,12 +8,13 @@ import { DeferredPromise } from 'vs/base/common/async';
import { Emitter, Event } from 'vs/base/common/event';
import { IMarkdownString, MarkdownString, isMarkdownString } from 'vs/base/common/htmlContent';
import { Disposable } from 'vs/base/common/lifecycle';
import { revive } from 'vs/base/common/marshalling';
import { basename } from 'vs/base/common/resources';
import { URI, UriComponents } from 'vs/base/common/uri';
import { URI, UriComponents, UriDto } from 'vs/base/common/uri';
import { generateUuid } from 'vs/base/common/uuid';
import { OffsetRange } from 'vs/editor/common/core/offsetRange';
import { ILogService } from 'vs/platform/log/common/log';
import { IChatAgent, IChatAgentService } from 'vs/workbench/contrib/chat/common/chatAgents';
import { IChatAgentData } from 'vs/workbench/contrib/chat/common/chatAgents';
import { ChatRequestTextPart, IParsedChatRequest, reviveParsedChatRequest } from 'vs/workbench/contrib/chat/common/chatParserTypes';
import { IChat, IChatContentInlineReference, IChatContentReference, IChatFollowup, IChatProgress, IChatReplyFollowup, IChatResponse, IChatResponseErrorDetails, IChatResponseProgressFileTreeData, IUsedContext, InteractiveSessionVoteDirection, isIUsedContext } from 'vs/workbench/contrib/chat/common/chatService';
@@ -57,7 +58,7 @@ export interface IChatResponseModel {
readonly username: string;
readonly avatarIconUri?: URI;
readonly session: IChatModel;
readonly agent?: IChatAgent;
readonly agent?: IChatAgentData;
readonly response: IResponse;
readonly isComplete: boolean;
readonly isCanceled: boolean;
@@ -294,7 +295,7 @@ export class ChatResponseModel extends Disposable implements IChatResponseModel
constructor(
_response: IMarkdownString | ReadonlyArray<IMarkdownString | IChatResponseProgressFileTreeData | IChatContentInlineReference>,
public readonly session: ChatModel,
public readonly agent: IChatAgent | undefined,
public readonly agent: IChatAgentData | undefined,
public readonly requestId: string,
private _isComplete: boolean = false,
private _isCanceled = false,
@@ -364,12 +365,7 @@ export interface ISerializableChatsData {
[sessionId: string]: ISerializableChatData;
}
export interface ISerializableChatAgentData {
id: string;
description?: string;
fullName?: string;
icon?: UriComponents;
}
export type ISerializableChatAgentData = UriDto<IChatAgentData>;
export interface ISerializableChatRequestData {
providerRequestId: string | undefined;
@@ -532,7 +528,6 @@ export class ChatModel extends Disposable implements IChatModel {
public readonly providerId: string,
private readonly initialData: ISerializableChatData | IExportableChatData | undefined,
@ILogService private readonly logService: ILogService,
@IChatAgentService private readonly chatAgentService: IChatAgentService,
) {
super();
@@ -566,7 +561,8 @@ export class ChatModel extends Disposable implements IChatModel {
: reviveParsedChatRequest(raw.message);
const request = new ChatRequestModel(this, parsedRequest, raw.providerRequestId);
if (raw.response || raw.responseErrorDetails) {
const agent = raw.agent && this.chatAgentService.getAgents().find(a => a.id === raw.agent!.id); // TODO do something reasonable if this agent has disappeared since the last session
const agent = (raw.agent && 'metadata' in raw.agent) ? // Check for the new format, ignore entries in the old format
revive<ISerializableChatAgentData>(raw.agent) : undefined;
request.response = new ChatResponseModel(raw.response ?? [new MarkdownString(raw.response)], this, agent, request.id, true, raw.isCanceled, raw.vote, raw.providerRequestId, raw.responseErrorDetails, raw.followups);
if (raw.usedContext) { // @ulugbekna: if this's a new vscode sessions, doc versions are incorrect anyway?
request.response.updateContent(raw.usedContext);
@@ -648,7 +644,7 @@ export class ChatModel extends Disposable implements IChatModel {
return this._requests;
}
addRequest(message: IParsedChatRequest, chatAgent?: IChatAgent): ChatRequestModel {
addRequest(message: IParsedChatRequest, chatAgent?: IChatAgentData): ChatRequestModel {
if (!this._session) {
throw new Error('addRequest: No session');
}
@@ -762,12 +758,7 @@ export class ChatModel extends Disposable implements IChatModel {
followups: r.response?.followups,
isCanceled: r.response?.isCanceled,
vote: r.response?.vote,
agent: r.response?.agent ? {
id: r.response.agent.id,
description: r.response.agent.metadata.description,
fullName: r.response.agent.metadata.fullName,
icon: r.response.agent.metadata.icon
} : undefined,
agent: r.response?.agent,
usedContext: r.response?.response.usedContext,
contentReferences: r.response?.response.contentReferences
};
@@ -8,7 +8,7 @@ import { Disposable } from 'vs/base/common/lifecycle';
import { URI } from 'vs/base/common/uri';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { ILogService } from 'vs/platform/log/common/log';
import { IChatAgent } from 'vs/workbench/contrib/chat/common/chatAgents';
import { IChatAgentData } from 'vs/workbench/contrib/chat/common/chatAgents';
import { ChatModelInitState, IChatModel, IChatRequestModel, IChatResponseModel, IChatWelcomeMessageContent, IResponse } from 'vs/workbench/contrib/chat/common/chatModel';
import { IParsedChatRequest } from 'vs/workbench/contrib/chat/common/chatParserTypes';
import { IChatReplyFollowup, IChatResponseCommandFollowup, IChatResponseErrorDetails, IChatResponseProgressFileTreeData, InteractiveSessionVoteDirection } from 'vs/workbench/contrib/chat/common/chatService';
@@ -89,7 +89,7 @@ export interface IChatResponseViewModel {
readonly requestId: string;
readonly username: string;
readonly avatarIconUri?: URI;
readonly agent?: IChatAgent;
readonly agent?: IChatAgentData;
readonly response: IResponse;
readonly isComplete: boolean;
readonly isCanceled: boolean;