Skip to content

Commit dd80613

Browse files
authored
feat(chat): filter namespace messages from history if it exists in the metadata VSCODE-611 (#866)
1 parent d5a9345 commit dd80613

File tree

3 files changed

+308
-167
lines changed

3 files changed

+308
-167
lines changed

src/participant/prompts/promptBase.ts

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ export interface PromptArgsBase {
1313
};
1414
context?: vscode.ChatContext;
1515
connectionNames?: string[];
16+
databaseName?: string;
17+
collectionName?: string;
1618
}
1719

1820
export interface UserPromptResponse {
@@ -163,16 +165,27 @@ export abstract class PromptBase<TArgs extends PromptArgsBase> {
163165
protected getHistoryMessages({
164166
connectionNames,
165167
context,
168+
databaseName,
169+
collectionName,
166170
}: {
167171
connectionNames?: string[]; // Used to scrape the connecting messages from the history.
168172
context?: vscode.ChatContext;
173+
databaseName?: string;
174+
collectionName?: string;
169175
}): vscode.LanguageModelChatMessage[] {
170176
const messages: vscode.LanguageModelChatMessage[] = [];
171177

172178
if (!context) {
173179
return [];
174180
}
175181

182+
let previousItem:
183+
| vscode.ChatRequestTurn
184+
| vscode.ChatResponseTurn
185+
| undefined = undefined;
186+
187+
const namespaceIsKnown =
188+
databaseName !== undefined && collectionName !== undefined;
176189
for (const historyItem of context.history) {
177190
if (historyItem instanceof vscode.ChatRequestTurn) {
178191
if (
@@ -181,9 +194,21 @@ export abstract class PromptBase<TArgs extends PromptArgsBase> {
181194
) {
182195
// When the message is empty or a connection name then we skip it.
183196
// It's probably going to be the response to the connect step.
197+
previousItem = historyItem;
184198
continue;
185199
}
186200

201+
if (previousItem instanceof vscode.ChatResponseTurn) {
202+
const responseIntent = (previousItem.result as ChatResult).metadata
203+
?.intent;
204+
205+
// If the namespace is already known, skip responses to prompts asking for it.
206+
if (responseIntent === 'askForNamespace' && namespaceIsKnown) {
207+
previousItem = historyItem;
208+
continue;
209+
}
210+
}
211+
187212
// eslint-disable-next-line new-cap
188213
messages.push(vscode.LanguageModelChatMessage.User(historyItem.prompt));
189214
}
@@ -206,11 +231,17 @@ export abstract class PromptBase<TArgs extends PromptArgsBase> {
206231
'emptyRequest',
207232
'askToConnect',
208233
];
209-
if (
210-
responseTypesToSkip.indexOf(
211-
(historyItem.result as ChatResult)?.metadata?.intent
212-
) > -1
213-
) {
234+
235+
const responseType = (historyItem.result as ChatResult)?.metadata
236+
?.intent;
237+
if (responseTypesToSkip.includes(responseType)) {
238+
previousItem = historyItem;
239+
continue;
240+
}
241+
242+
// If the namespace is already known, skip including prompts asking for it.
243+
if (responseType === 'askForNamespace' && namespaceIsKnown) {
244+
previousItem = historyItem;
214245
continue;
215246
}
216247

@@ -232,6 +263,7 @@ export abstract class PromptBase<TArgs extends PromptArgsBase> {
232263
// eslint-disable-next-line new-cap
233264
messages.push(vscode.LanguageModelChatMessage.Assistant(message));
234265
}
266+
previousItem = historyItem;
235267
}
236268

237269
return messages;

0 commit comments

Comments
 (0)