Skip to content

Commit a4627c7

Browse files
authored
refactor(chat): simplify history logic (aws#6946)
## Problem History logic cleanup ## Solution - History does not need to be in triggerPayload - ChatHistory does not need tools - We don't need to create and maintain a separate newUserMessage object --- - Treat all work as PUBLIC. Private `feature/x` branches will not be squash-merged at release time. - Your code changes must meet the guidelines in [CONTRIBUTING.md](https://github.com/aws/aws-toolkit-vscode/blob/master/CONTRIBUTING.md#guidelines). - License: I confirm that my contribution is made under the terms of the Apache 2.0 license.
1 parent aefe920 commit a4627c7

File tree

4 files changed

+25
-56
lines changed

4 files changed

+25
-56
lines changed

packages/core/src/codewhispererChat/controllers/chat/chatRequest/converter.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,6 @@ export function triggerPayloadToChatRequest(triggerPayload: TriggerPayload): { c
175175
},
176176
chatTriggerType,
177177
customizationArn: customizationArn,
178-
history: triggerPayload.chatHistory,
179178
},
180179
}
181180
}

packages/core/src/codewhispererChat/controllers/chat/controller.ts

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ import {
8282
createSavedPromptCommandId,
8383
aditionalContentNameLimit,
8484
additionalContentInnerContextLimit,
85-
tools,
8685
workspaceChunkMaxSize,
8786
defaultContextLengths,
8887
} from '../../constants'
@@ -1355,24 +1354,15 @@ export class ChatController {
13551354
triggerPayload.contextLengths.userInputContextLength = triggerPayload.message.length
13561355
triggerPayload.contextLengths.focusFileContextLength = triggerPayload.fileText.length
13571356

1357+
const request = triggerPayloadToChatRequest(triggerPayload)
1358+
13581359
const chatHistory = this.chatHistoryStorage.getTabHistory(tabID)
1359-
const newUserMessage = {
1360-
userInputMessage: {
1361-
content: triggerPayload.message,
1362-
userIntent: triggerPayload.userIntent,
1363-
...(triggerPayload.origin && { origin: triggerPayload.origin }),
1364-
userInputMessageContext: {
1365-
tools: tools,
1366-
...(triggerPayload.toolResults && { toolResults: triggerPayload.toolResults }),
1367-
},
1368-
},
1360+
const currentMessage = request.conversationState.currentMessage
1361+
if (currentMessage) {
1362+
chatHistory.fixHistory(currentMessage)
13691363
}
1370-
const fixedHistoryMessage = chatHistory.fixHistory(newUserMessage)
1371-
if (fixedHistoryMessage.userInputMessage?.userInputMessageContext) {
1372-
triggerPayload.toolResults = fixedHistoryMessage.userInputMessage.userInputMessageContext.toolResults
1373-
}
1374-
triggerPayload.chatHistory = chatHistory.getHistory()
1375-
const request = triggerPayloadToChatRequest(triggerPayload)
1364+
request.conversationState.history = chatHistory.getHistory()
1365+
13761366
const conversationId = chatHistory.getConversationId() || randomUUID()
13771367
chatHistory.setConversationId(conversationId)
13781368
request.conversationState.conversationId = conversationId
@@ -1426,8 +1416,8 @@ export class ChatController {
14261416
}
14271417
this.telemetryHelper.recordEnterFocusConversation(triggerEvent.tabID)
14281418
this.telemetryHelper.recordStartConversation(triggerEvent, triggerPayload)
1429-
if (request.conversationState.currentMessage) {
1430-
chatHistory.appendUserMessage(request.conversationState.currentMessage)
1419+
if (currentMessage) {
1420+
chatHistory.appendUserMessage(currentMessage)
14311421
}
14321422

14331423
getLogger().info(

packages/core/src/codewhispererChat/controllers/chat/model.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import * as vscode from 'vscode'
77
import {
88
AdditionalContentEntry,
9-
ChatMessage,
109
Origin,
1110
RelevantTextDocument,
1211
ToolResult,
@@ -203,7 +202,6 @@ export interface TriggerPayload {
203202
traceId?: string
204203
contextLengths: ContextLengths
205204
workspaceRulesCount?: number
206-
chatHistory?: ChatMessage[]
207205
toolResults?: ToolResult[]
208206
origin?: Origin
209207
}

packages/core/src/codewhispererChat/storages/chatHistory.ts

Lines changed: 16 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@
22
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
33
* SPDX-License-Identifier: Apache-2.0
44
*/
5-
import { ChatMessage, Tool, ToolResult, ToolResultStatus, ToolUse } from '@amzn/codewhisperer-streaming'
5+
import { ChatMessage, ToolResult, ToolResultStatus, ToolUse } from '@amzn/codewhisperer-streaming'
66
import { randomUUID } from '../../shared/crypto'
77
import { getLogger } from '../../shared/logger/logger'
8-
import { tools } from '../constants'
98

109
// Maximum number of messages to keep in history
1110
const MaxConversationHistoryLength = 100
@@ -20,12 +19,10 @@ export class ChatHistoryManager {
2019
private history: ChatMessage[] = []
2120
private logger = getLogger()
2221
private lastUserMessage?: ChatMessage
23-
private tools: Tool[] = []
2422

2523
constructor(tabId?: string) {
2624
this.conversationId = randomUUID()
2725
this.tabId = tabId ?? randomUUID()
28-
this.tools = tools
2926
}
3027

3128
/**
@@ -97,10 +94,10 @@ export class ChatHistoryManager {
9794
* 4. If the last message is from the assistant and it contains tool uses, and a next user
9895
* message is set without tool results, then the user message will have cancelled tool results.
9996
*/
100-
public fixHistory(newUserMessage: ChatMessage): ChatMessage {
97+
public fixHistory(newUserMessage: ChatMessage): void {
10198
this.trimConversationHistory()
10299
this.ensureLastMessageFromAssistant()
103-
return this.handleToolUses(newUserMessage)
100+
this.ensureCurrentMessageIsValid(newUserMessage)
104101
}
105102

106103
private trimConversationHistory(): void {
@@ -145,42 +142,27 @@ export class ChatHistoryManager {
145142
}
146143
}
147144

148-
private handleToolUses(newUserMessage: ChatMessage): ChatMessage {
145+
private ensureCurrentMessageIsValid(newUserMessage: ChatMessage): void {
149146
const lastHistoryMessage = this.history[this.history.length - 1]
150-
if (!lastHistoryMessage || !lastHistoryMessage.assistantResponseMessage || !newUserMessage) {
151-
return newUserMessage
152-
}
153-
154-
const toolUses = lastHistoryMessage.assistantResponseMessage.toolUses
155-
if (!toolUses || toolUses.length === 0) {
156-
return newUserMessage
157-
}
158-
159-
return this.addToolResultsToUserMessage(newUserMessage, toolUses)
160-
}
161-
162-
private addToolResultsToUserMessage(newUserMessage: ChatMessage, toolUses: ToolUse[]): ChatMessage {
163-
if (!newUserMessage.userInputMessage) {
164-
return newUserMessage
147+
if (!lastHistoryMessage) {
148+
return
165149
}
166150

167-
const toolResults = this.createToolResults(toolUses)
151+
if (lastHistoryMessage.assistantResponseMessage?.toolUses?.length) {
152+
const toolResults = newUserMessage.userInputMessage?.userInputMessageContext?.toolResults
153+
if (!toolResults || toolResults.length === 0) {
154+
const abandonedToolResults = this.createAbandonedToolResults(
155+
lastHistoryMessage.assistantResponseMessage.toolUses
156+
)
168157

169-
if (newUserMessage.userInputMessage.userInputMessageContext) {
170-
newUserMessage.userInputMessage.userInputMessageContext.toolResults = toolResults
171-
} else {
172-
newUserMessage.userInputMessage.userInputMessageContext = {
173-
shellState: undefined,
174-
envState: undefined,
175-
toolResults: toolResults,
176-
tools: this.tools.length === 0 ? undefined : [...this.tools],
158+
if (newUserMessage.userInputMessage?.userInputMessageContext) {
159+
newUserMessage.userInputMessage.userInputMessageContext.toolResults = abandonedToolResults
160+
}
177161
}
178162
}
179-
180-
return newUserMessage
181163
}
182164

183-
private createToolResults(toolUses: ToolUse[]): ToolResult[] {
165+
private createAbandonedToolResults(toolUses: ToolUse[]): ToolResult[] {
184166
return toolUses.map((toolUse) => ({
185167
toolUseId: toolUse.toolUseId,
186168
content: [

0 commit comments

Comments
 (0)